Согласно этому ответу: максимальная длина URL-адреса 257 символов для mod_rewrite? существует жесткое ограничение на 255 символов в зависимости от файловой системы для использования mod_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}?
Три строки ниже сообщают 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]
Для меня работает следующее (проверено на виртуальном хосте по умолчанию на 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]