Apache:% 25 в URL (400 неправильных запросов) - PullRequest
7 голосов
/ 23 августа 2010

У меня есть URL-адрес, содержащий следующее:

/somepath/morestuff/ohno%25foobar

По какой-то причине apache сообщает о 400 неверных запросах (он имеет отношение к% 25).Я использую mod_rewrite, чтобы переписать путь, указывающий на мой экземпляр codeigniter, но он даже не достигает codeigniter, это просто ошибка apache по умолчанию.

Есть идеи?

Ответы [ 3 ]

12 голосов
/ 23 августа 2010

Я подозреваю, что вы используете PATH_INFO для обработки ваших запросов CodeIgniter. Следовательно, ваш .htaccess файл содержит набор правил, который выглядит примерно так:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php/$0 [L]

Когда mod_rewrite проверяет ваши URL-адреса, они уже были декодированы в их естественный формат символов, поэтому в этом случае %25 становится просто %. При применении этого правила обратная ссылка фактически содержит буквенный текст somepath/morestuff/ohno%foobar, который не перекодирован по умолчанию. Apache не знает, что делает % в вашем пути запроса к /index.php/somepath/morestuff/ohno%foobar и задыхается, сообщая вам об этой ошибке.

Если вы используете Apache 2.2, mod_rewrite добавил для этой цели флаг B, позволяющий вам автоматически избегать обратных ссылок, переписанных в ваш URL. Добавление его в ваш текущий список флагов должно решить проблему в этом случае:

RewriteRule ^.*$ index.php/$0 [B,L]

Существует также escape RewriteMap, который доступен как внутренняя карта в предыдущих версиях Apache mod_rewrite, но, к сожалению, эту карту необходимо включить на уровне конфигурации сервера или виртуального сервера, поэтому может быть недоступно, если ваш сайт работает на виртуальном хостинге. Он делает то же самое, хотя и немного осознанно.

В конфигурации вашего сервера / виртуального сервера:

RewriteMap escape int:escape

Тогда везде, где вы определяете свои правила:

RewriteRule ^.*$ index.php/${escape:$0} [L]

Имейте в виду, что CodeIgniter не нужно использовать PATH_INFO для получения информации о запросе, и использование REQUEST_URI здесь вполне допустимо, если вы не используете mod_rewrite для каких-либо других преобразований (и избегаете эта головная боль вообще). Я думаю, что по умолчанию CodeIgniter настроен на получение запроса от AUTO (при условии, что я не перепутал свои фреймворки), поэтому просто не переписывать запрос на URL с информацией о пути будет достаточно, чтобы внести это изменение.

2 голосов
/ 21 сентября 2010

Apache 2.2.12+, просто используйте флаг B. В противном случае смотрите здесь:

http://www.dracos.co.uk/code/apache-rewrite-problem/

1 голос
/ 30 января 2013

В JQuery перед установкой в ​​URL, вы должны кодировать, как это это будет кодировать% и / и ..... " encodeURI (encodeURI (encodeURIComponent ('your string'))); "

на php или просмотрите страницу, которую вы должны декодировать, как следует

urldecode (urldecode (htmlspecialchars ('ваша закодированная строка', ENT_QUOTES))))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...