httpd.conf 中忽略了 RewriteCond

httpd.conf 中忽略了 RewriteCond

简单地说,这在 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] 

答案1

RewriteRule ^([^/]+)/?$ https://example.net?u=$1 [L,NC,R=301] 

但是当我将其移动到 httpd.conf 时它什么也不做。

因为在一个服务器上下文RewriteRule 图案永远不会匹配。在服务器上下文中,URL 路径是相对于根目录的,以斜杠开头。URL.htaccess路径中没有目录前缀,因此永远不会以斜杠开头。

我已经尝试过目录指令,但还是没有什么区别。

只要您包含了正确的目录路径,那么这应该可以工作。(并重新启动 Apache。)但是,如果您仍然有一个.htaccess启用重写引擎的文件,那么这将覆盖容器中的服务器指令<Directory>,因此<Directory>指令仍然不会执行任何操作。

作为测试,httpd.conf 中的以下内容确实有影响,它会重新重定向,但会对所有页面执行此操作,即忽略该条件。

RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-f 
:

因为在一个服务器上下文请求还没有被映射到文件系统,所以SCRIPT_FILENAME(或REQUEST_FILENAME)尚未包含完整的文件系统路径(它仅包含 URL 路径),因此此条件始终计算为 true(正在测试的“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是多余的。

相关内容