2012-02-01 121 views
3

我試圖在htaccess文件如下:的.htaccess重定向循環時,重定向和重寫規則一起

我要301重定向這個 - >http://www.domain.com/somepage.php?page=foo

本 - >http://www.domain.com/my-pretty-url/

這工作得很好,當我修改網站上的內部鏈接閱讀我多麼想和我不使用的R = 301標誌:

RewriteRule ^my-pretty-url/$ /index\.php?page=foo [L] 

但是...日這裏的順利是我也想301將任何外部請求重定向到服務器,當我處理它時,它將我置於重定向循環中。

RewriteCond %{REQUEST_URI} /index.php$ 
RewriteCond %{QUERY_STRING} ^page=foo$ 
RewriteRule ^.*$ http://www.domain.com/my-pretty-url/? [R=301,L] 

RewriteRule ^my-pretty-url/$ /index\.php?page=foo [L] 

的規則的RewriteCond不要被自己的工作,只有在底部的一個重寫規則的工作方式本身內部重寫,但它不處理外的請求。

顯然,如果我兩者都在一起,它會創建一個循環。我如何解決這個問題?

謝謝!

回答

4

請嘗試以下方法防止循環

#prevent internal redirects, and prevent loop 
RewriteCond %{ENV:REDIRECT_STATUS} !200 
RewriteCond %{REQUEST_URI} /index.php$ 
RewriteCond %{QUERY_STRING} ^page=foo$ 
RewriteRule ^.*$ http://www.domain.com/my-pretty-url/? [R=301,L] 

RewriteRule ^my-pretty-url/$ /index\.php?page=foo [L] 
+1

感謝您的快速回復,但我想我會在這裏留下了一個細節都被調用的頁面是一個CMS,頁面不能真的被重命名,所以「page =」參數是必需的。你和我都有的解決方案是假設頁面實際上被重命名爲漂亮的URL(true?)。 – gtr1971 2012-02-01 21:17:08

+0

@GregR。這是理想的,但不必將網頁重命名爲漂亮的網址。如果用戶使用頁面參數單擊舊頁面,則第一條規則會將它們重定向到漂亮的URL。第二條規則會將其重寫回舊的url(就像CMS期望的那樣),而另外的'RewriteCond'將防止循環。 – 2012-02-01 21:29:35

+0

我遺漏了「?」在漂亮的url重寫規則的末尾。一旦我把它,它完全奏效。謝謝!! – gtr1971 2012-02-01 21:37:26