Переписанные URL с длиной параметра> 255 не работают

Я использую mod_rewrite, чтобы переписать URL-адреса, как это:

http://example.com/1,2,3,4/foo/

Делая это в.htaccess:

RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]

Он работает нормально, за исключением случаев, когда "1,2,3,4" превращается в строку длиной более 255 символов, Apache возвращает "403 Forbidden".

Нет проблем с посещением foo.php?id=1,2,3,4 напрямую, даже с очень длинной строкой идентификатора, однако это не вариант для меня.

Есть ли какие-то настройки Apache или другие, которые я должен настроить?

ОБНОВЛЕНИЕ: я включил RewriteLog с RewriteLogLevel 9. С короткой строкой идентификатора, я получаю несколько строк в моем файле журнала. Но когда строка id больше 255 символов, ничего не записывается (кажется, что mod_rewrite даже не выполняется?).

Если вы нашли этот вопрос интересным / полезным, пожалуйста, подпишите его.

4 ответа

Решение

Как вы думаете, вы сталкиваетесь с ограничением файловой системы?

Может быть максимальная длина имени файла составляет 255 байтов, и когда apache или правило mod_rewrite проверяет, существует ли файл, операционная система возвращает ошибку в apache.

Если вы добавите какое-то правило в свой файл.htaccess, будет слишком поздно, чтобы обойти эту проблему. Apache уже попытался определить имя файла и выдавшую ошибку файловой системы "(36) слишком длинное имя файла", возвращая ошибку 403.

Может быть, вы могли бы изменить шаблон URL внутри вашего приложения. до 255 символов от слэша до слэша.

РЕДАКТИРОВАТЬ: посмотрите здесь для подробного ответа на этот вопрос. Я позаимствовал мой оттуда.

Есть аналогичный вопрос об этом пределе здесь:

Возможно, вы столкнулись с ограничением базовой файловой системы

Я не знаю, используете ли вы REQUEST_FILENAME где-то в вашей конфигурации.htaccess, поэтому не знаю, будет ли работать предоставленное решение.

Вы готовы сменить http сервер? Тогда рассмотрим nginx вместо apache.

И используйте http://wiki.nginx.org/NginxHttpRewriteModule

Определенно интересный вопрос. Вы запускаете mod_security и если так, пробовали без него? Возможно, ему просто не нравятся длинные или длинные пути с незашифрованными запятыми в них? ^^

Хотя это инстинктивно больше похоже на ограничение пути URL-адреса или, по крайней мере, отдельных его сегментов или интерпретацию его базовой файловой системой, как писал GmonC. Это также объясняет, почему обычный URL с длинной частью в строке запроса работает нормально.

Я думаю, что старый ASP.NET имел ограничение на путь запроса ~260 символов или что-то еще.

Другие вопросы по тегам