Я использую 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. С короткой строкой идентификатора я получаю несколько строк в моем файле журнала. Но когда строка идентификатора больше 255 символов., ничего регистрируется (кажется, что mod_rewrite даже не выполняется?).
Если вы нашли этот вопрос интересным / полезным, проголосуйте за него.
Вы думаете, что столкнулись с ограничениями файловой системы?
Может быть максимальная длина имени файла составляет 255 байтов, и когда apache или правило mod_rewrite проверяет, существует ли файл, операционная система возвращает apache ошибку.
Если вы поместите какое-то правило в свой файл .htaccess, уже слишком поздно решать проблему. Apache уже попытался определить имя файла и выдал ошибку файловой системы «(36) File name too long», возвращая ошибку 403.
Возможно, вы могли бы изменить шаблон URL-адреса в своем приложении. до 255 символов от косой черты до косой черты.
РЕДАКТИРОВАТЬ: посмотрите Вот для подробного ответа на этот вопрос. Я позаимствовал свой оттуда.
Есть аналогичный вопрос об этом ограничении Вот:
Вы можете столкнуться с ограничением базовой файловой системы
Я не знаю, используете ли вы REQUEST_FILENAME где-то в своей конфигурации .htaccess, поэтому не знаю, будет ли предоставленное решение работать.
Вы готовы сменить http-серверы? Тогда рассмотрите nginx вместо apache.
И использовать http://wiki.nginx.org/NginxHttpRewriteModule
Однозначно интересный вопрос. Вы запускаете mod_security, и если да, то пробовали без него? Возможно, ему просто не нравятся длинные имена путей или длинные имена путей с незакодированными запятыми? ^^
Хотя инстинктивно это больше похоже на ограничение пути URL или, по крайней мере, его отдельных сегментов или его интерпретацию базовой файловой системой, как написал GmonC. Это также объясняет, почему обычный url с длинной частью в строке запроса работает нормально.
Я думаю, что старый ASP.NET имел ограничение пути запроса ~ 260 символов или что-то в этом роде.