AllowOverride和RewriteCond / RewriteRule交互

时间:2016-01-06 15:29:28

标签: apache .htaccess mod-rewrite

我正在尝试设置在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如何覆盖重写规则?

1 个答案:

答案 0 :(得分:0)

  

如果有,有什么规则决定.htaccess   可以覆盖重写规则吗?

条件和规则并不决定.htaccess如何运作。 AllowOverride允许使用.htaccess。如果你有AllowOverride All,那么.htaccess是允许的,如果你有AllowOverride None,那么它就不会被忽略。在2.4 None是默认值。

.htaccess是每个目录,所以如果它位于一个已应用规则的目录中,只要允许.htaccess文件使用,它将优先。在VirtualHostDirectory指令中的服务器配置中对此进行了配置。

在vhost中使用.htaccess的include也是一个非常糟糕的配置。如果您有权访问vhost文件或配置,则应创建另一个配置并将其包含在.htaccess内容中。

您实际上不应该使用.htaccess文件at all来访问服务器配置。请参阅此apache建议,不要使用.htaccess。 https://httpd.apache.org/docs/2.4/howto/htaccess.html#when