Я подозреваю, что вы используете 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 с информацией о пути будет достаточно, чтобы внести это изменение.