在我的 Apachehttpd.conf
文件中,我在标签内有这个声明VirtualHost
。
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.shanestillwell.com$ [NC]
RewriteRule ^(.*)$ http://www.shanestillwell.com/$1 [L,R=301]
这在我的.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
我的规则httpd.conf
似乎被忽略了。规则是否在.htaccess
清除httpd.conf
重写规则?
答案1
通常,目录中 .htaccess 文件中的设置会覆盖 httpd.conf 文件中的设置。您可以通过编辑 httpd.conf 文件并更改以下行来禁用此效果
<Directory ...>
AllowOverride all
到
<Directory ...>
AllowOverride none
这将防止 .htaccess 文件覆盖 httpd.conf 设置。因此 .htaccess 文件中的设置将不起作用。
答案2
在 Apache 中,.htaccess 文件是否会覆盖 mod_rewrites 的 httpd.conf?
从字面上看,答案是“不”。然而……
在我的 Apache文件中,我在标签
httpd.conf
内有此声明VirtualHost
如果真的是这样直接地在容器内<VirtualHost>
,即在虚拟主机上下文,那么这些 mod_rewrite 指令应该覆盖文件中的 mod_rewrite 指令.htaccess
- 而不是相反。此行为无法更改(例如,通过使用指令更改 mod_rewrite 继承RewriteOptions
)。
但是,如果这些指令位于<Directory>
容器内(即位于您的<VirtualHost>
容器内),即在目录上下文(而不是虚拟主机上下文,如上所述),那么您.htaccess
文件中的 mod_rewrite 指令确实会完全覆盖容器中的 mod_rewrite 指令<Directory>
。但是,这种行为能可以通过更改 mod_rewrite 指令的继承方式进行更改。(通过RewriteOptions InheritBefore
在文件中.htaccess
或RewriteOptions InheritDownBefore
父<Directory>
容器中设置。InheritDownBefore
需要 Apache 2.4.8。但是,还需要注意 mod_rewrite 继承的其他注意事项。)
参考:
https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriteoptions
您所看到的行为(以及所使用的指令的具体语法(见下文) - 虽然如果代码从未执行过,这可能只是一个错误?)表明这些指令处于目录上下文,而不是虚拟主机上下文。所以是的,中的 mod_rewrite 指令.htaccess
将完全覆盖父指令 - 容器中的 mod_rewrite 指令<Directory>
实际上被忽略了。
在旁边:
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC] RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
如果这被用在虚拟主机那么你会在 URL 路径的开头得到一个错误的双斜杠,因为在虚拟主机上下文RewriteRule
图案匹配完整的 URL 路径(包含斜杠前缀)。因此,$1
在包含额外的斜杠之前,反向引用本身已经包含斜杠前缀代换。
然而,在一个目录上下文,RewriteRule
图案匹配部分路径 - 文件系统路径减去目录前缀(以斜杠结尾) - 因此匹配的路径RewriteRule
图案永远不要以斜线开头目录上下文(因此你需要将其包含在代换- 就像你所做的那样)。
答案3
如果你有一个<Directory ...>
with AllowOverride all
,那么你的 .htaccess 文件中的任何内容都将取代任何先前的规则。
只要它指向您的域路径,它就可以在您的里面httpd.conf
或上面。virtualhost
/