简单地说,这在 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
是多余的。