1 回答

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個贊
這可能就是您正在尋找的:
RewriteEngine on
# externally redirect profile/index.php?id=1 to /profile/1
RewriteCond %{QUERY_STRING} (?:^|&)id=(\d+)(?:&|$)
RewriteRule ^/?player/?$ /player/%1 [R=301,END]
# internally rewrite /profile/1 to profile/index.php?id=1
RewriteRule ^/?player/(\d+)/?$ /player/id=$1 [QSA,END]
然后你可以像往常一樣id從 php 的超全局變量中獲取實(shí)際的數(shù)字,$_GET['id']在本例中也是如此。
這假設(shè)請求以/player/某種方式映射到您設(shè)置中的處理 php 腳本。你的問題表明情況確實(shí)如此,這就是為什么我沒有進(jìn)一步詳細(xì)說明這一點(diǎn)。
根據(jù)您的實(shí)際應(yīng)用程序邏輯(它發(fā)送或生成的引用),您不需要首先重定向。但是你肯定需要將傳入的請求重寫為 php 能夠處理的內(nèi)容。您的應(yīng)用程序邏輯絕對應(yīng)該只使用表單的引用/player/1,第一次重定向僅適用于在某處添加書簽的舊引用,或者如果您的應(yīng)用程序邏輯的某些部分尚未修復(fù)以使用新的引用模式。
最好先使用 302 臨時重定向,然后在確定一切設(shè)置正確后才將其更改為 301 永久重定向。這可以防止嘗試時出現(xiàn)緩存問題......
如果您使用上述規(guī)則收到內(nèi)部服務(wù)器錯誤(http 狀態(tài) 500),那么您很可能使用的是非常舊版本的 apache http 服務(wù)器。[END]在這種情況下,您將在 http 服務(wù)器錯誤日志文件中看到不支持標(biāo)志的明確提示。您可以嘗試升級或使用舊[L]標(biāo)志,在這種情況下它可能會起到相同的作用,盡管這有點(diǎn)取決于您的設(shè)置。
此實(shí)現(xiàn)將在 http 服務(wù)器主機(jī)配置或分布式配置文件(“.htaccess”文件)中同樣工作。顯然,重寫模塊需要在http服務(wù)器內(nèi)部加載并在http主機(jī)中啟用。如果您使用分布式配置文件,您需要注意它的解釋在主機(jī)配置中完全啟用,并且它位于主機(jī)的 DOCUMENT_ROOT 文件夾中。
一般性評論:您應(yīng)該始終更喜歡將此類規(guī)則放置在 http 服務(wù)器主機(jī)配置中,而不是使用分布式配置文件(“.htaccess”)。這些分布式配置文件增加了復(fù)雜性,通常是意外行為的原因,難以調(diào)試,而且它們確實(shí)減慢了 http 服務(wù)器的速度。它們僅作為最后一個選項(xiàng)提供,用于您無法訪問真正的 http 服務(wù)器主機(jī)配置(閱讀:非常便宜的服務(wù)提供商)或堅(jiān)持編寫自己的規(guī)則的應(yīng)用程序(這顯然是一個安全噩夢)的情況。
- 1 回答
- 0 關(guān)注
- 95 瀏覽
添加回答
舉報