2012-01-01 42 views
3

我想重定向/重寫我的name.php文件到/名稱/ 我找到了另一個主題的解決方案(http://stackoverflow.com/questions/5527789/htaccess -rewrite -in-directory-hide-php-extension-and-force-trailing-slash)/file.php到/文件/嘗試

雖然,我想自己學習,並從頭開始。 我第一次使用這一個,這使得例如的.com /測試/顯示的.com/test.php的內容:

RewriteEngine On 
RewriteRule ^(.*)/$ $1.php 

然後我試圖下面,通過自身時會被重定向的.com/test.php的to .com/test /:

RewriteEngine On 
RewriteRule ^(.*)\.php$ http://www.mydomain.info/$1/ [R=301] 

所以,兩者都是在自己的工作。但是當我將它們結合起來時,即使我向它添加了[L],也會出現循環錯誤,這應該意味着規則只應該使用一次。所以這不起作用:

RewriteEngine On 
RewriteRule ^(.*)/$ $1.php [L] 
RewriteRule ^(.*)\.php$ http://www.mydomain.info/$1/ [L,R=301] 

我可能已經做了一些愚蠢的錯誤,但它在邏輯上似乎我... 希望有人能指出我的錯誤。 謝謝。

+0

請看我更新的答案。 – ziesemer 2012-01-08 03:24:34

回答

1

因爲您有一個外部重定向R=301,添加L並不能滿足您的需要,因爲重定向會作爲全新請求返回到服務器 - 它會再次匹配您的第一次重寫規則。

相反,你需要像這樣:

RewriteCond %{THE_REQUEST} ^\w+\ /(.*)\.php\ HTTP/ 
RewriteRule^/%1/ [R=301] 

RewriteRule ^(.*)/$ $1.php 

注意THE_REQUEST原始請求,例如整線匹配GET /index.php HTTP/1.1。即使%{REQUEST_URI}被重寫爲.php作爲第二條規則的一部分(它將在內部子請求上匹配),%{THE_REQUEST}也不會被重寫,並且這將確保重寫爲.php的URL在子請求上不匹配並導致另一個重定向發送回客戶端。

1

從第一條規則中刪除L標誌。這將停止「執行」,第二條規則不會被使用。在第二條規則中,你應該保留L標誌,因爲它是最後一個。

+0

我測試了這個,它似乎沒有工作。 – ziesemer 2012-01-01 03:22:27

+0

如果這種方法有效,會非常好,但是我可以得到相同的結果。 – Steven 2012-01-01 03:32:58

+0

但你也讓出R = 301? – Dion 2012-01-01 03:55:12

相關問題