Как изменить mod_rewrite, чтобы избежать {REQUEST_FILENAME} и обойти ограничение URL в 255 символов?

Как изменить mod_rewrite, чтобы избежать {REQUEST_FILENAME} и обойти ограничение URL в 255 символов?

Согласно этому ответу:максимальная длина URL-адреса 257 символов для mod_rewrite?Для использования mod_rewrite существует жесткое ограничение в 255 символов, основанное на файловой системе.

Согласно принятому ответу, есть два решения:

  1. Измените формат URL-адреса вашего приложения так, чтобы между каждым слешем было не более 255 символов.
  2. Переместите правила перезаписи в конфигурацию виртуального хоста Apache и удалите REQUEST_FILENAME.

Я не могу использовать первый метод, поэтому пытаюсь разобраться со вторым.

Я поместил правила Rewrite в конфигурацию виртуального хоста Apache, как и было запрошено. Однако я не могу понять, как удалить REQUEST_FILENAME и при этом заставить работать фреймворк моего веб-приложения (Dragonfly).

Вот часть правил перезаписи, которую я перенес из .htaccess в файл конфигурации виртуального хоста Apache:

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

# if don't want Dragonfly to process html files comment
# out the line below (you may need to remove the [OR] above too).
RewriteCond %{REQUEST_FILENAME} \.(html|nl)$

# Main URL rewriting.
RewriteRule (.*) index.cgi?$1 [L,QSA]

Я пробовал удалить {REQUEST_FILENAME}, но это просто нарушает фреймворк разными способами. Как мне переписать это без использования {REQUEST_FILENAME}?

решение1

Три строки ниже сообщают 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

У меня работает следующее (проверено на виртуальном хосте по умолчанию в 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]

Связанный контент