我試圖設置一個在Apache 2.4.16上運行的站點,以將所有www URL重定向到非www URL。我使用HTML5 Boilerplate的Apache配置來執行此操作(以及它們提供的所有其他操作)。AllowOverride和RewriteCond/RewriteRule交互
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
整個文件添加到我的虛擬主機配置的網站,以及一個AllowOverride All
另一.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(在文檔根目錄)
<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>
現在,幾乎一切從H5BP的.htaccess
是工作,除了從WWW到非www重定向。之後我發現重定向只在我從虛擬主機中的<Directory>
塊中刪除AllowOverride All
時才起作用。所以doc根.htaccess
在某種程度上覆蓋了重寫條件。
我實際上已經解決了我的問題,最初由.htaccess
內容移動文檔根到虛擬主機文件,並移除了AllowOverride,但我爲爲什麼這是發生更多的好奇;更具體地說,AllowOverride如何與RewriteCond和RewriteRule進行交互。
我的預感是我的doc根中的.htaccess
覆蓋了www到非www重定向,但我不確定這是爲什麼。例如,http - > https重定向工作沒有問題(H5BP的352行,未註釋掉),它似乎只是一個重定向。我甚至認爲這些規則可以被覆蓋,因爲RewriteCond/RewriteRules對我來說是獨一無二的。
如果有,確定.htaccess
如何覆蓋重寫規則的規則是什麼?
我的包含是爲html5樣板服務器配置,它恰好也被命名爲.htaccess。我可以更改它的名稱並獲得相同的結果。對不起,如果不清楚。 我的理解是,當AllowOverride是All時,.htaccess實際上覆蓋了指令,所以我想知道它是如何覆蓋我的一些重寫規則的。 –
好吧,我明白了。我不會把它叫做.htaccess。原因是這是[AccessFileName](https://httpd.apache.org/docs/2.4/howto/htaccess.html#what)的默認名稱,您可能會以這種方式創建問題。使用服務器配置,性能會更好。將名稱更改爲其他名稱。它確實覆蓋每個目錄的指令。因此,正如我所提到的,.htaccess中的內容將優先於配置。但是,您當前的.htaccess規則不包含任何與重定向到非www相沖突的內容。所以這是別的。 –
是的,我切換到服務器配置,這確實解決了我的問題,我的問題更想知道爲什麼發生在第一個地方。當我將doc根目錄下的.htaccess的內容移動到vhost配置時,重定向開始工作。所以對我來說,它看起來像在docroot的.htaccess重寫了我的一些重寫規則,我認爲這是不可能的,因爲它們不會像你提到的那樣發生衝突。 –