2012-06-05 76 views
2

我有這樣一個骯髒的URL:http://www.netairspace.com/photos/photo.php?photo=3392。 我想要做一些類似http://www.netairspace.com/photos/OH-LTU/Finnair_Airbus_330-202X/OUL_EFOU_Oulu/photo_3392/(並且稍後支持諸如http://www.netairspace.com/pic/3392/之類的簡短網址,但我不會說)。.htaccess和SEO網址 - 爲什麼這是一個無限循環?

所以我有一個腳本photo_seo_url.php,它需要照片ID,建立SEO網址,並做一個重定向(302爲測試,301當我滿意)。然後,我計劃在調用舊的URL添加的.htaccess mod_rewrite的規則,以便:

  • 舊的URL將被改寫內部對photo_seo_url.php
  • photo_seo_url.php會301/302重定向到URL SEO
  • SEO的URL將被改寫內部對原始photo.php

這樣,我會,從理論上講,拿到SEO URL的優勢,同時能夠在我的閒暇退休舊的。

這是我使用的規則:

RewriteEngine on 
RewriteRule ^photos/.*/photo_([0-9]+)/?$ photos/photo.php?photo=$1 [NC,L] 
RewriteCond %{QUERY_STRING} photo=([0-9]+) 
RewriteRule ^photos/photo\.php$ photos/photo_seo_url.php?photo=%1 [NC,L] 

但是,進入一個無限重定向循環。爲什麼,如果這兩個人正在進行內部重寫而不是外部重定向 - 或者我缺少的是什麼?

我已經解決了添加新的文件showphoto.php,它不只是包括原始photo.php,並改變線路2問題:

RewriteEngine on 
RewriteRule ^photos/.*/photo_([0-9]+)/?$ photos/showphoto.php?photo=$1 [NC,L] 
RewriteCond %{QUERY_STRING} photo=([0-9]+) 
RewriteRule ^photos/photo\.php$ photos/photo_seo_url.php?photo=%1 [NC,L] 

但我還是想了解爲什麼原始版本進入無限循環。我錯過了或誤解了一些東西。我的方法是否正確?

+1

第一組規則對我來說看起來很好 - 如果可以的話,嘗試添加一些重寫日誌記錄以查看發生了什麼。我無法發現會出現循環的情況。 – Ansari

+0

我按照http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog的規定,在調試級別爲4的httpd.conf中添加了RewriteLog,然後重新啓動。在提出請求時,會創建一個空白的日誌文件。 –

+0

是的,就是那個。 – Ansari

回答

3

要回答你的問題,爲什麼會發生這種循環?這就是SEO URI所發生的情況,比如GET /photos/OH-LTU/Finnair_Airbus_330-202X/OUL_EFOU_Oulu/photo_3392/

  • 規則1的火災轉換這對一個GET /photos/photo.php?photo=3392觸發內部重定向,然後重新啓動.htaccess文件的掃描。

  • 規則2然後觸發將其轉換爲GET photos/photo_seo_url.php?photo=339,觸發內部重定向,再次重新開始掃描.htaccess文件。

  • 沒有進一步的匹配發生,因此它被傳遞給腳本photos/photo_seo_url.php然後執行302到/photos/OH-LTU/Finnair_Airbus_330-202X/OUL_EFOU_Oulu/photo_3392/並且瀏覽器檢測到重定向循環。

你需要做的是規則1觸發,即使在內部重定向後也不能防止規則2觸發。要做到這一點的方法之一是設置環境變量,說END(這被轉換爲REDIRECT_END在下通),如果它被設置爲跳過規則:

RewriteEngine on 
RewriteBase /

RewriteRule ^photos/.*/photo_([0-9]+)/?$ photos/photo.php?photo=$1 [NC,E=END:1,L] 

RewriteCond %{ENV:REDIRECT_END}:%{QUERY_STRING} ^:photo=([0-9]+)$ 
RewriteRule ^photos/photo\.php$   photos/photo_seo_url.php?photo=%1 [NC,L] 

的另一種方法是添加一個虛擬noredir參數寫入重寫的URI並添加:

RewriteCond %{QUERY_STRING} !\bnoredir 

到原來的第二條規則。但是,photo.php需要忽略這一點。希望這有助於:-)

+0

「,它會觸發內部重定向,然後重新啓動對.htaccess文件的掃描。」這就是我錯過的東西。謝謝。在製作過程中,我可能會堅持使用我現有的解決方案或重命名photo.php,因爲我理解的更好,但我一定會在我的開發系統上嘗試它,以便我可以從中學習。 –

2
RewriteEngine on 
RewriteRule ^photos/.*/photo_([0-9]+)/?$ photos/photo.php?photo=$1&rewritten [NC,L] 

RewriteCond %{QUERY_STRING} !rewritten 
RewriteCond %{QUERY_STRING} photo=([0-9]+) 
RewriteRule ^photos/photo\.php$ photos/photo_seo_url.php?photo=%1 [NC,L]