2011-09-11 192 views
0

我有這樣的代碼,所有.PHP重定向到沒有擴展名:隱藏擴展名和擴展名爲重定向URL

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)/$ $1.php 

所以/example.php = /例如

我想它,所以如果有人點擊在/example.php上它們會自動以/ example結尾。

什麼是最好的方式去呢?將這兩個鏈接的工作視爲重複的內容?

+0

這種重定向有什麼意義? –

+0

[Redirect * .php to clean URL](http://stackoverflow.com/q/2267488/)的可能重複,[在url mod_rewrite中隱藏擴展名.php](http://stackoverflow.com/q/6241408/ ) – outis

回答

2

試試這個:

RewriteEngine On 

# if requested .php file directly, then redirect to extension-less URL 
# (do it on initial rewrite iteration only) 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule ^(.+)\.php$ /$1 [R=301,L] 

# Your "add .php file extension" rule goes below 

這種方法的問題是,%{ENV:REDIRECT_STATUS}變量可能不被填充/由Apache的安裝/配置支持。不幸的是,我不知道需要做些什麼才能使其工作。


如果上述方法無效,請嘗試以下解決方法 - 它會工作但不是說「好」,並在某些情況下可能會失敗(查詢字符串值是這裏的薄弱點):

RewriteEngine On 

# if requested .php file directly, then redirect to extension-less URL 
# (do it on initial rewrite iteration only) 
RewriteCond %{THE_REQUEST} ^[A-Z]+\s.+\.php\sHTTP/.+ 
RewriteRule ^(.+)\.php$ /$1 [R=301,L] 

# Your "add .php file extension" rule goes below 

在這條規則重寫條件是很重要的 - 沒有它,你就會有無窮的重定向循環,你的瀏覽器會在某個時刻中止(除非它是不夠聰明(或請求是由一些編碼不機器人完成)並且這樣的過程必須被殺死全線)。

把這樣的重定向規則放在「添加.php文件擴展名」規則的上面或下面並不重要 - 我只是希望保持所有301重定向接近頂端。

+0

@checkenginelight所以..這個規則是否適合你? – LazyOne

+0

是的第二個似乎工作非常感謝! – checkenginelight

0

您可以執行301「永久移動」重定向,通知客戶端請求的資源已移動並在新位置可用。要做到這一點使用RewriteRule,添加[R=301,L]標誌的規則規範,例如:

RewriteRule ^(.*)/$ $1.php [R=301,L] 

這被認爲是「搜索引擎友好的」重定向方法。

+0

當我將它添加到我的代碼中時,我可以訪問我的/example.php頁面,但不會訪問/ example頁面,因爲它會像這樣重定向到somethign:http://www.domain1.com/home/username/domains/domain1。 com/public_html/example.php我想要它,當我嘗試點擊/example.php它會自動帶我到/例如 – checkenginelight

+0

然後,你需要寫規則的另一種方式:'RewriteRule(。*)。php $/$ 1 [R = 301,L]' –