2011-04-28 94 views
0

我想重寫像http://www.url.com/blog/?p=123http://www.url.com/#blog/123的網址。我的事情閱讀的時候,發現你只能解析查詢字符串中的RewriteCond所以我想是這樣的:URL重寫查詢字符串的問題

RewriteCond %{QUERY_STRING} ^p=([0-9]*)$ 
RewriteRule ^.*$ /#blog/%0 [NE,R] 

當我嘗試這個網址,最終被改寫爲:

http://www.url.com/#blog/p=213?p=213

任何想法如何正確地做到這一點?另外,有沒有辦法添加額外的RewriteCond來檢查REQUEST_URI是否包含博客?

回答

0

您可以完全去除查詢字符串做到這一點:

RewriteCond %{QUERY_STRING} ^p=([0-9]*)$ 
RewriteRule ^.*$ /#blog/%1? [NE,R] 

這應該給你:

http://www.url.com/#blog/213 

如果你想檢查URL包含術語「博客」,那麼幹脆檢查:

RewriteCond %{REQUEST_URI} .*/blog/.* 

重要的是要注意,你將無法檢查「博客」在像http://www.url.com/#blog這樣的鏈接中,正如Patrick所指出的那樣,#之後的所有內容都不會發送到服務器。

查看Apache wiki on mod_rewrite瞭解更多信息。

+0

有沒有辦法擺脫p =重寫的網址?我需要http://www.url.com/#blog/213而不是http://www.url.com/#blog/p=213。 – blcArmadillo 2011-04-28 22:01:22

+0

@blcArmadillo - 抱歉,這是一個錯字 - 我給你的重寫規則應該給你url.com/#blog/213。 – 2011-04-28 22:05:56

+0

我也會認爲這會工作,但由於某種原因,它仍然把P =在重寫的URL ......奇怪。有任何想法嗎? – blcArmadillo 2011-04-28 22:40:49

0

這可能無法工作,因爲瀏覽器不哈希(#)與請求後發送該URL的片段,所以http://www.url.com/#blog/p=213?p=213任何請求都將是http://www.url.com/

請求散列片段被認爲是用於頁面上的錨定標記,並且永遠不會發送到服務器。

+0

用戶發送的請求是http://www.url.com/blog/p = 123。但是根據當前的重寫規則,當我希望將它重寫爲http:// www時,請求url正在被重寫爲http://www.url.com/#blog/p=213?p=213 .url.com /#博客/ 213。 – blcArmadillo 2011-04-28 21:15:32

+0

由於上述原因,請勿在重寫規則中使用散列。爲了讓它在沒有散列的情況下工作,使用類似這樣的方法:'RewriteRule ^/blog /([0-9] +)$ blog/$ 1 [R = 301]' – Patrick 2011-04-28 22:10:20

0

嘗試在你的.htaccess文件中這樣的規則:

Options +FollowSymlinks -MultiViews 
RewriteEngine on 

RewriteCond %{QUERY_STRING} ^p=(.*)$ [NC] 
RewriteRule ^blog/?$ /#blog/%1? [NC,NE,L,R] 

隨着http://localhost/blog/?p=1234一個網址上面會成爲http://localhost/#blog/1234