Как изменить mod_rewrite для предотвращения {REQUEST_FILENAME} для обхождения 255 пределов символа URL?

Я только протестировал это на Ubuntu, но Вы могли попробовать следующее:

echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6

И если это, кажется, работает, можно сделать это постоянным путем добавления следующего к /etc/sysctl.conf:

net.ipv6.conf.all.disable_ipv6=1
4
задан 13 April 2017 в 15:14
2 ответа

У меня работает следующее (проверено на виртуальном хосте по умолчанию на debian с apache 2.2.21).

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} (.{255}) [OR]
RewriteCond %{REQUEST_FILENAME} \.(html|nl)$ [OR]
RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteCond %{REQUEST_FILENAME} !-l [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /index.cgi?$1 [L,QSA]
0
ответ дан 3 December 2019 в 04:01

Три строки ниже сообщают Apache о необходимости проверить файловую систему на предмет существования файла.

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f [OR]

Первая означает «если URI не является каталогом». Второй означает «если URI не является ссылкой». Третье означает «если URI не является файлом».

Если вы удалите или закомментируете эти строки, Apache применит приведенную ниже перезапись ко всем файлам, которые не заканчиваются на «.html» или «.nl». и не будет сначала проверять файловую систему, чтобы увидеть, существует ли файл.

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


Потенциально лучшим изменением было бы добавить новое правило над тремя строчками, например:

RewriteRule (.*[^/]{255}.*) index.cgi?$1 [L,QSA]

Это перехватит любые URI, содержащие одну строку из более чем 255 символов между косыми чертами, и отправит их прямо для перезаписи без проверки файловой системы. Параметр [L] гарантирует, что Apache больше не будет проверять правила, если они соответствуют этому. Нет опасности перехвата URI, которые были бы сопоставлены с реальными файлами, потому что URI, соответствующие этому регулярному выражению, не будут допустимыми путями к файлам.

Обновление:

Регулярное выражение, которое соответствует любому URI длиной не менее 255 символов.

RewriteRule (.{255}) index.cgi?$1 [L,QSA]
2
ответ дан 3 December 2019 в 04:01

Теги

Похожие вопросы