Невозможно разрешить эти символы в URL: -% / \ # + - PullRequest
1 голос
/ 12 июля 2010

О системе

У меня есть URL-адреса этого формата в моем проекте: -

http://project_name/browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0

Где keyword/class pair означает поиск по ключевому слову "class".

Ниже приведен мой файл htaccess: -

##AddHandler application/x-httpd-php5 .php

Options Includes +ExecCGI
Options +FollowSymLinks

<IfModule mod_rewrite.c>
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 


</IfModule>

У меня есть общий файл 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

И первый работает, а второй - нет.Обратите внимание на index.php?browse_by_exam в первом.

Но я не могу использовать первое соглашение об URL.Я должен сделать / работать с index.php скрытым.Пожалуйста, помогите

Еще раз спасибо Sandeepan

Редактировать (решено)

Учитывая ответ Бобинса на другой мой вопрос

urlencodedПрямая косая черта ломает URL , я чувствую, что лучше иметь такие URL-адреса: - http://project_name/browse_by_exam?type/tutor_search/keyword/class %2Fnew/new_search/1/search_exam/0/search_subject/0

Таким образом я избавляюсь от сложности читаемости, вызванной соглашением &param1=value1&param2=value2, а также могуразрешить прямую косую черту в части строки запроса с помощью ?

Я хочу избежать AllowEncodedSlashes, потому что Бобинс сказал 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 Ответ

2 голосов
/ 12 июля 2010

Некоторые проблемы звучат так, как будто они связаны с тем, что вы пытаетесь использовать PATH_INFO (ваш RewriteRule оставляет все позади index.php, как если бы это был путь). Можно ли будет просто использовать переменную $_SERVER['REQUEST_URI'] в качестве входных данных для функции парсера URL? Он содержит ту же информацию, и я чувствую, что это будет менее проблематично.

Попытка создать решение PATH_INFO, похоже, не очень хорошо работает в контексте per-dir (.htaccess). Вы можете установить AllowPathInfo On, но как только 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'];

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

...