2016-01-06 62 views
2

我試圖設置一個在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如何覆蓋重寫規則的規則是什麼?

回答

0

如果有什麼規則可以決定.htaccess 如何覆蓋重寫規則?

條件和規則並不指定.htaccess的工作方式。 AllowOverride是什麼允許使用.htaccess。如果你有AllowOverride All然後.htaccess是允許的,如果你有AllowOverride None,那麼它不是,它會被忽略。在2.4 None是默認值。

.htaccess是每個目錄,所以如果它位於應用規則的目錄中,只要.htaccess文件使用被允許,它將優先。其中在VirtualHostDirectory指令的服務器配置中進行了配置。

在虛擬主機中使用.htaccess的include還是一個非常糟糕的配置。如果您有權訪問vhost文件或配置文件,則應創建另一個配置文件並將其與.htaccess內容一起包含。

您不應該使用.htaccess文件at all實際上可以訪問服務器配置。看到這個Apache建議不使用.htaccess。 https://httpd.apache.org/docs/2.4/howto/htaccess.html#when

+0

我的包含是爲html5樣板服務器配置,它恰好也被命名爲.htaccess。我可以更改它的名稱並獲得相同的結果。對不起,如果不清楚。 我的理解是,當AllowOverride是All時,.htaccess實際上覆蓋了指令,所以我想知道它是如何覆蓋我的一些重寫規則的。 –

+0

好吧,我明白了。我不會把它叫做.htaccess。原因是這是[AccessFileName](https://httpd.apache.org/docs/2.4/howto/htaccess.html#what)的默認名稱,您可能會以這種方式創建問題。使用服務器配置,性能會更好。將名稱更改爲其他名稱。它確實覆蓋每個目錄的指令。因此,正如我所提到的,.htaccess中的內容將優先於配置。但是,您當前的.htaccess規則不包含任何與重定向到非www相沖突的內容。所以這是別的。 –

+0

是的,我切換到服務器配置,這確實解決了我的問題,我的問題更想知道爲什麼發生在第一個地方。當我將doc根目錄下的.htaccess的內容移動到vhost配置時,重定向開始工作。所以對我來說,它看起來像在docroot的.htaccess重寫了我的一些重寫規則,我認爲這是不可能的,因爲它們不會像你提到的那樣發生衝突。 –