Я использую 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 даже не выполняется?).
Если вы нашли этот вопрос интересным / полезным, пожалуйста, подпишите его.
RewriteLog
и RewriteLogLevel
вы сможете увидеть, что сопоставляется и как оно действительно переписывается. Я бы предположил, что копируется только 255 символов $1
, и это в конечном итоге является тем, id
что клиент не имеет права видеть, поэтому Apache возвращает 403. Я не смотрел на код, но может быть, что Apache манипулирует обратная ссылка в фиксированном 256-байтовом буфере (256-й зарезервирован для завершающего NULL).