在 Apache 中,.htaccess 文件是否会覆盖 mod_rewrites 的 httpd.conf?

在 Apache 中,.htaccess 文件是否会覆盖 mod_rewrites 的 httpd.conf?

在我的 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在文件中.htaccessRewriteOptions 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/

相关内容