2012-09-13 42 views
17

我想了解使用.htaccess重定向和重寫URL之間的區別。 所以這裏有一個例子:假設我有一個像www.abc.com/ index.php?page=product_types&cat=88的鏈接(稱之爲「原始」 URL)瞭解重定向和重寫之間的區別.htaccess

但當abc.com/shoes(我們稱之爲「期望」 URL)的用戶類型,他們需要看到的內容以上鍊接。要做到這一點,我會這樣做:

Options +FollowSymLinks 
RewriteEngine on 
RewriteBase/
RewriteRule ^(.*)shoes(.*)$ index.php?page=product_types&cat=88 

這段代碼沒有錯,它的確有竅門。但是,如果我在地址欄中輸入原始網址,則會出現內容,但網址不會更改。因此,它仍然是www.abc.com/index.php?page=product_types&cat=88

但是如果我想要在地址欄中顯示所需的網址(/shoes),如果我在www.abc.com/ index.php?page=product_types&cat=88中鍵入,該怎麼辦?這將如何使用.htaccess完成?我是否陷入潛在的循環?

+2

是的,我會用PHP來做這個。 .htaccess可以在理論上起作用,但如果你這樣做了很多次,管理重定向的順序就越來越難以防止循環。我知道它很痛苦,但可能值得花時間構建出請求路由以支持應用程序中的漂亮URL。 –

+0

我想我明白了@JoeMills。從搜索引擎優化的角度來看,我不知道是否有任何危險重定向的原始網址 - >所需的應用程序內? – Ray

回答

25

一些解釋可以在這裏找到:https://stackoverflow.com/a/11711948/851273

要點是,重寫只發生在服務器上,客戶端(瀏覽器)是視而不見。瀏覽器發送請求並獲取內容,但對服務器發生的事情並不明智,以便爲請求提供服務。

重定向是一個服務器響應一個請求,告訴客戶端(瀏覽器)提交一個新的請求。瀏覽器請求一個URL,這個URL是位置欄中的內容,服務器獲取該請求並且以重定向作出響應,瀏覽器獲取響應並將URL加載到服務器的響應中。地址欄中的URL現在是新的URL,瀏覽器會發送新URL的請求。

簡單地在服務器上進行內部重寫對網頁中的URL完全沒有影響。如果谷歌或reddit或任何網站有鏈接到www.abc.com/index.php?page=product_types&cat=88,您的內部服務器重寫規則絕對沒有這一點,也沒有任何人點擊該鏈接,或任何客戶發生任何請求該URL的任何原因。所有重寫規則都會在內部更改服務器中包含shoes/index.php?page=product_types&cat=88的內容。

如果你想讓它成爲index.php頁面的所有查詢字符串請求,你可以告訴客戶端(瀏覽器)重定向到更好看的URL。你需要小心,因爲重寫規則循環,你的重定向將被內部重寫,這將導致重定向,這將在內部重寫,等等。導致循環,並將引發500服務器錯誤。所以你可以特別匹配請求本身:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\?page=product_types&cat=88 
RewriteRule ^/?index.php$ /shoes [L,R=301] 

這應該只用於使它在野外的鏈接指向正確的地方。 您必須確保您的內容正在生成正確的鏈接。這意味着您網站上的所有內容都使用/shoes鏈接,而不是/index.php?page=product_types&cat=88鏈接。

+0

完美!正是我在尋找的!謝謝,@Jon – Ray

+0

我沒有看到你鏈接的其他答案,因爲我只是在.htaccess標籤內搜索接受的答案 – Ray