2016-12-30 134 views
3

我正在重新構建我的私人博客。我現在想使用PHP的主機。但是,我想隱藏.php擴展名,並使用.html代替。另一方面,主機需要重寫.php以實際運行腳本。所以我想:將.php重定向到.html,在.htaccess中將.html內部重寫爲.php

  1. 外部重定向一個.php到相應.html URL的任何請求,所以用戶不會「看」到PHP URL。

  2. 在內部將.html文件的任何請求重寫爲.php文件名以執行實際的PHP腳本。

據我所知,主機使用Apache與mod_rewrite。

基本上我覺得我需要的是:

RedirectEngine On 
RedirectMatch 301 ^(.*).php$ $1.html 
RewriteRule ^(.*).html$ $1.php [L] 

不過,我得到一個無限重定向循環到.html文件。就好像RewriteRule再次自動觸發RedirectMatch一樣。 我也試過的RewriteRuleRewriteCondRewriteBase代替RedirectMatch各種組合,但隨後重定向通常去一些主控器內部的目錄結構(如/bla/foo/user/xyz/.../file.html),並RedirectBase顯示沒有影響。

任何幫助表示讚賞!

回答

2

對於這樣的事情,你只需要使用mod_rewrite。 RedirectMatch是一個mod_alias指令,因此可能會導致衝突(不同的模塊在不同的時間運行,儘管配置文件中有明顯的順序)。無論如何,你仍然需要小心重定向/重寫循環。

# 1. Externally redirect `.php` requests to `.html` 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule ^(.+)\.php$ /$1.html [R=302,L] 

RewriteCond指令,檢查針對REDIRECT_STATUS環境變量防止被重定向重寫 URL(這將導致重定向循環)。 REDIRECT_STATUS在第一次重寫後(下),設置爲「200」(200 OK HTTP狀態)。

當您確定工作正常時,將302(臨時)重定向到301。 301s被瀏覽器強制緩存,因此可能會使測試出現問題。

然後,執行內部,就像你收到了(記得要逃脫點以匹配字面點):

# 2. Internally rewrite `.html` to `.php` 
RewriteRule ^(.+)\.html$ $1.php [L] 

彷彿RewriteRule再次自動觸發RedirectMatch

是的,這確實發生(原因上面RewriteCond指令)。當URL被重寫/改變時,整個過程將重複,直到URL通過不變。

但重定向則通常去一些主機託管服務提供商內部的目錄結構

當您嘗試重定向到一個相對路徑在每個目錄(即.htaccess)背景下會出現這種情況。目錄前綴(內部目錄文件系統路徑)在重寫的URL上加上前綴。對於外部重定向,您需要指定絕對或相對URL。

RedirectBase顯示沒有效果。

那麼,RewriteBase指令將解決上述重定向到相對路徑的問題。 RewriteBase指令有效地更改添加回相對路徑替換的目錄前綴。這就是它所做的一切。如果你不使用相對路徑替換,那麼它不起作用。