Не мог позволить эти символы в URL:-% / \# +

О системе

У меня есть 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.

1
задан Community 23 May 2017 в 10:32
поделиться

1 ответ

Некоторые проблемы звучат так, будто они связаны с тем, что вы пытаетесь использовать 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'];

Если вы действительно не можете сделать это вот так, Я не уверен, что есть решение (в другом вашем вопросе было объяснение, почему это проблематично), но я посмотрю, возможно ли это вообще, и вернусь к вам.

2
ответ дан 2 September 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: