О системе
У меня есть URL этого формата в моем проекте:-
http://project_name/browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0
Где keyword/class
пара означает поиск с ключевым словом "класса".
Следующее является моим htaccess файлом:-
##AddHandler application/x-httpd-php5 .php
Options Includes +ExecCGI
Options +FollowSymLinks
RewriteEngine on
############To remove index.php from URL
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
#################################################end of find a class
У меня есть общий index.php файл, который выполняется для каждого модуля в проекте. Существует только переписать правило удалить index.php из URL (как Вы видите выше).
Я не использую htaccess, переписывают правила для определения $ _GET массив. У меня есть функция синтаксического анализатора URL в PHP внутри, который делает это вместо этого. Для URL в качестве примера я дал, синтаксический анализатор возвращает:-
Array ( [a] => browse_by_exam [type] => tutor_search [keyword] => class [new_search] => 1 [search_exam] => 0 [search_subject] => 0 )
Я использую urlencode () при подготовке поискового URL и urldecode () при чтении поискового URL
Проблема
Я сталкиваюсь с проблемами с некоторыми символами в URL
Character Response
% 400 - Bad Request - Your browser sent a request that this server could not understand.
/ 404 - Not FOund
\ # + Page does not break but urldecode() removes these characters.
Я хочу позволить все эти символы. Какова могла быть проблема? Как я позволяю их? Помогите Спасибо, Sandeepan
Обновления
Теперь только / символ вызывает повреждение URL (404 ошибки как прежде). Так, я попробовал путем удаления htaccess, переписывают правило, которое скрывает index.php в URL и попробованный полным URL вместо этого. Для критерия поиска class/new
Я попробовал следующими двумя URL:-
http://project_name/index.php?browse_by_exam/type/tutor_search/keyword/class%2Fnew/new_search/1/search_exam/0/search_subject/0
http://project_name/index.php/browse_by_exam/type/tutor_search/keyword/class%2Fnew/new_search/1/search_exam/0/search_subject/0
И первые работы, но 2-я не делают. Заметьте index.php?browse_by_exam
в первом.
Но я не могу использовать 1-ю конвенцию URL. Я должен сделать / работа с index.php скрытый. Помогите
Еще раз спасибо Sandeepan
(Решенное) редактирование
Рассмотрение ответа Bobince на мой другой вопрос
Наклонная черта вправо urlencoded повреждает URL, я чувствую, лучше иметь URL как этот:- http://project_name/browse_by_exam?type/tutor_search/keyword/class %2Fnew/new_search/1/search_exam/0/search_subject/0
Тем путем я избавляюсь от трудности удобочитаемости, вызванной ¶m1=value1¶m2=value2
конвенция и также способный позволить наклонные черты вправо в части строки запроса при помощи ?
Я хочу избежать AllowEncodedSlashes, потому что Bobince заявил Also some tools or spiders might get confused by it. Although %2F to mean / in a path part is correct as per the standard, most of the web avoids it.
Некоторые проблемы звучат так, будто они связаны с тем, что вы пытаетесь использовать PATH_INFO
(ваше RewriteRule
прикрепляет все за index.php
, как если бы это был файл дорожка). Можно ли вместо этого просто использовать переменную $ _ SERVER ['REQUEST_URI']
в качестве входных данных для вашей функции парсера URL? Он содержит ту же информацию, и я считаю, что это было бы менее проблематично.
Попытка создать решение PATH_INFO
, похоже, не очень хорошо работает в контексте per-dir ( .htaccess
). Вы можете установить AllowPathInfo на
, но как только mod_rewrite
попытается перенаправить URL-адрес внутри, кажется, что Apache не хочет анализировать конечную часть URL-адреса, что приводит к Ошибка 404.
Если вместо этого вы используете $ _ SERVER ['REQUEST_URI']
, то вы можете просто переписать его в index.php
без конечной информации, например:
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
Насколько ошибка 400 идет, ваш %
должен быть закодирован как % 25
с помощью urlencode ()
, но похоже, что по какой-то причине может возникнуть проблема. Я бы проверил, действительно ли ваши URL-адреса поиска правильно кодируются в выводе, отправляемом в браузер, так как это может быть связано с проблемами с другими оставшимися символами (но я не уверен).
Изменить: Если вы использовали переопределение выше, у вас были бы URL-адреса типа
http://project_name/browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0
, и они были бы внутренне перенаправлены на index.php
.Затем вы можете получить часть
/browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0
из $ _ SERVER ['REQUEST_URI']
в этом скрипте (она будет содержать это значение), которую вы затем можете проанализировать, как вы делаете сейчас. Я не уверен, почему вы должны иметь возможность перезаписывать его после index.php
, поскольку вы можете получить эту информацию, даже если это не так, и она выглядит точно так же для пользователя в их браузер. Вы даже можете сделать это в начале скрипта, если часть, которая использует $ _ SERVER ['PATH_INFO']
, недоступна для изменения:
$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];
Если вы действительно не можете сделать это вот так, Я не уверен, что есть решение (в другом вашем вопросе было объяснение, почему это проблематично), но я посмотрю, возможно ли это вообще, и вернусь к вам.