2012-06-28 115 views
0

我知道有太多的問題存在htaccess重定向,但我找不到確切的解決方案。如果存在匹配的問題,我很抱歉。CakePHP htaccess刪除www

在我的公開HTML(Web根目錄)文件夾中有下列htaccess文件:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php [QSA,L] 
</IfModule> 

然後重定向的URL以「WWW」到「非www。」我補充兩行。和文件變成這個樣子:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php [QSA,L] 

    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] 
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

</IfModule> 

所以問題是, www.example.com重定向到example.comwww.example.com/mycontroller/沒有重定向到example.com/mycontroller/

我該如何解決這個問題?

回答

5

第一個RewriteRule會將每個沒有實際物理文件/文件夾的URL重寫到index.php頁面,但如果匹配,它會將其視爲最後一條規則並停止處理所有其他規則( [L]標誌)。所以當你只使用根路徑調用時,它不會被觸發並繼續到你的www重寫規則,但是任何其他邏輯URL都會觸發第一次重寫並停止。

只需更改規則的順序,將您的RewriteCond/RewriteRule對放在默認值之前。

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] 
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php [QSA,L] 


</IfModule> 

如果你運行該虛擬主機和訪問Apache的配置文件,考慮把你的規則在Apache的虛擬主機的conf文件,以避免該被覆蓋,當你更新蛋糕的版本,或者確保以其它方式保護您的變化。

+0

非常感謝。我沒有談到「L」參數。還要感謝關於Apache配置文件的建議。 – trante

+0

RedirectMatch http:// www。(。*)\。(。*)http://(。*)\。(。*)似乎也能正常工作。你能告訴我概念上的區別嗎? –

+1

RedirectMatch帶有一個不同的Apache模塊(mod_alias)。它實現了類似的事情,但比RewriteCond/RewriteRule更不靈活和強大。您只能匹配URL路徑(因此,您的示例將不起作用,因爲它包含www子域,它不是URL路徑的一部分,您的重定向URL也是正則表達式)。使用RewriteCond/RewriteRule,您可以匹配請求的各個部分並具有多個條件。 – danielv

相關問題