Проще говоря, это работает в htaccess:
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^/]+)/?$ https://example.net?u=$1 [L,NC,R=301]
Но когда я перемещаю его в httpd.conf, он ничего не делает. Я пробовал в directory
директива, и это тоже не имеет значения.
В качестве теста, приведенное ниже в httpd.conf действительно влияет, он перенаправляет, но делает это для всех страниц, т.е. условие игнорируется.
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ https://example.net?u=$1 [L,NC,R=301]
RewriteRule ^([^/]+)/?$ https://example.net?u=$1 [L,NC,R=301]
Но когда я перемещаю его в httpd.conf, он ничего не делает.
Потому что в сервер контекст RewriteRule
шаблон никогда не совпадет. В контексте сервера URL-путь является относительным от корня и начинается с косой черты. В .htaccess
URL-путь меньше префикса каталога, поэтому никогда не начинается с косой черты.
Я пробовал использовать директиву каталога, и это тоже не имеет значения.
Это должно было сработать, если вы указали правильный путь к каталогу. (И перезапустил Apache.) Однако, если у вас все еще был .htaccess
файл, который включил механизм перезаписи, то это переопределило бы директивы сервера в <Directory>
контейнер, поэтому <Directory>
директивы ничего бы не сделали.
В качестве теста, приведенное ниже в httpd.conf действительно влияет, он перенаправляет, но делает это для всех страниц, т.е. условие игнорируется.
RewriteEngine on RewriteCond %{SCRIPT_FILENAME} !-f :
Потому что в сервер контекст запрос еще не был сопоставлен с файловой системой, поэтому SCRIPT_FILENAME
(или REQUEST_FILENAME
) еще не содержит полный путь к файловой системе (он просто содержит URL-путь), поэтому это условие всегда оценивается как истинное (проверяемый "URL-путь" не является физическим файлом, а это наверное верный).
Вместо этого вам нужно использовать предварительный просмотр, чтобы определить окончательное значение. т.е. %{LA-U:REQUEST_FILENAME}
.
Итак, в сервер (или виртуальный хост) вместо этого вам нужно будет использовать следующее:
RewriteEngine on
RewriteCond %{LA-U:REQUEST_FILENAME} !-f
RewriteCond %{LA-U:REQUEST_FILENAME} !-d
RewriteRule ^/([^/]+)/?$ https://example.net?u=$1 [L,R=301]
Обратите внимание на префикс косой черты на RewriteRule
шаблон.
В NC
флаг здесь лишний.