2012-11-08 209 views
0

我見過很多網站,但沒有找到解釋這一點的指南。 我有這樣的.htaccess代碼重定向網址並在地址欄上顯示短網址

Options +FollowSymLinks 
RewriteEngine On 
RewriteRule ^users/(\d+)*$ ./profile.php?id=$1 

它重定向到site.com/user/1 site.com/profile.php?id=1 但是當它重定向我希望用戶在他的地址欄中看到縮短的網址(site.com/user/1)

我該怎麼做?

回答

1

重寫是服務器的內在邏輯,即要求你在地址欄中看到長URL的瀏覽器和HTTP服務器是路由到一個更短。如果您希望瀏覽器顯示較短的網址,則需要使用Redirect而不是Rewrite

請注意,使用重定向時,頁面加載速度會較慢,因爲服務器會將重定向響應返回給瀏覽器,然後再重新請求該頁面。

+0

謝謝,那麼它是'重定向^用戶/(\ d +)* $ ./profile.php?id = $ 1'?並且我把它放在' '? – Dotan

+0

你在使用什麼服務器 - 它是Apache嗎? 如果是這樣,你應該使用的指令是'RedirectMatch'。它與模塊mod_rewrite無關,所以你不需要把它放在條件子句中。 – onon15

+0

是的,apache。我剛剛嘗試過'RedirectMatch art /(.*)/article.php?a = $ 1',然後重定向到完整的地址並更改地址欄上的地址。它可以與服務器的apache設置有關嗎?感謝您的幫助 – Dotan

0

規則的工作原理是:

RewriteRule <pattern_A> <target_B> 

總是從<pattern_A>作品<target_B>,從來沒有倒過來,也沒有在2個請求該規則的「鏈接」。 top part of this answer解決了當「URL爲其他URL更改」時發生的兩種不同情況。

規則,你有一個沒有查詢字符串的URL,並在內部用一個查詢字符串重寫它的PHP文件。瀏覽器沒有看到發生這種情況,這是「幕後」。當你說你想讓地址欄顯示沒有查詢字符串的URL時,你首先需要找到一些其他的URL,並且URL需要在外部重定向瀏覽器。所以,在你已經擁有的規則:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /profile\.php\?id=([^&\ ]+) 
RewriteRule^/users/%1? [L,R=301] 

,對請求字符串,而不是請求URI(其被沿着URL處理管道和重寫引擎更改)相匹配,提取ID,並重定向瀏覽器通過使用R=301標誌轉換爲不帶查詢字符串的新URL。

你真的需要改變所有內容,讓他們使用,而不是依靠重定向瀏覽器的一個非常繁瑣和效率低下的方式,然後在內部重寫原來的URL清潔尋找網址。