我正在尝试设置在Apache 2.4.16上运行的网站,以将所有www网址重定向到非www网址。我正在使用HTML5 Boilerplate的Apache配置来执行此操作(以及他们提供的所有其他内容)。
https://github.com/h5bp/server-configs-apache/blob/master/dist/.htaccess
这发生在第380行,见下文:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]
</IfModule>
我正在使用Include
将整个文件添加到我的网站的vhost配置中,并使用AllowOverride All
添加我的doc根目录中的另一个.htaccess
文件(同一个来自Laravel 5):
production.vhost.conf(相关部分)
<Directory /var/www/hostname/production>
AllowOverride All
# Include H5BP server configs
Include server-configs-apache/dist/.htaccess
</Directory>
.htaccess(在doc root上)
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
现在,除了从www到非www的重定向外,几乎来自H5BP的.htaccess
的所有内容都正常工作。在四处寻找之后,我注意到重定向仅在我从vhost中的AllowOverride All
块中删除<Directory>
时才起作用。因此,文档根.htaccess
以某种方式覆盖了重写条件。
我实际上已经通过将doc根.htaccess
内容移动到vhost文件并删除AllowOverride来修复我的初始问题,但我更好奇为什么这是发生;更具体地说,AllowOverride如何与RewriteCond和RewriteRule交互。
我的预感是我的doc根目录中的.htaccess
覆盖了www到非www重定向,但我不确定为什么会这样做。例如,http - &gt; https重定向工作没有问题(H5BP的352行,我的未注释),它似乎只是一个重定向。我甚至不认为这些规则可以被覆盖,因为RewriteCond / RewriteRules对我来说是独一无二的。
如果有,有哪些规则可以确定.htaccess
如何覆盖重写规则?
答案 0 :(得分:0)
如果有,有什么规则决定.htaccess 可以覆盖重写规则吗?
条件和规则并不决定.htaccess如何运作。 AllowOverride
允许使用.htaccess。如果你有AllowOverride All
,那么.htaccess是允许的,如果你有AllowOverride None
,那么它就不会被忽略。在2.4 None
是默认值。
.htaccess是每个目录,所以如果它位于一个已应用规则的目录中,只要允许.htaccess文件使用,它将优先。在VirtualHost
或Directory
指令中的服务器配置中对此进行了配置。
在vhost中使用.htaccess的include也是一个非常糟糕的配置。如果您有权访问vhost文件或配置,则应创建另一个配置并将其包含在.htaccess内容中。
您实际上不应该使用.htaccess文件at all
来访问服务器配置。请参阅此apache建议,不要使用.htaccess。
https://httpd.apache.org/docs/2.4/howto/htaccess.html#when