Назад | Перейти на главную страницу

RewriteCond игнорируется в httpd.conf

Проще говоря, это работает в 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 флаг здесь лишний.