2014-01-16 54 views
0

我們正在努力爲我們的論壇遷移到另一個平臺,我們也遇到了這具有查詢在他們的鏈接,如htaccess的重寫規則

http://forum.test/threads/119312-Warnight-CS-GO?p=2306618&viewfull=1#post2306618

其具有指向http://forum.test/threads/warnight-cs-go.119312/#post-2306618

所以原始鏈接的邏輯結構是:

http://{forum_base_url}/threads/{thread-id}-{thread-permalink}?p={post-id}&viewfull={post-number-in-thread}#post{post-id} 

雖然新的一個是:

http://{forum_base_url}/threads/{thread-permalink}.{thread-id}/#post-{post-id} 

所以對於重寫工作,我們需要「拉」三件事出原始鏈接:線程ID的永久鏈接,和後ID。前兩個不是問題,這是第三個不想合作的問題。

在網上淘了可能的解決方案後,我們提出了:

RewriteCond %{QUERY_STRING} ^p=(\d+)&viewfull=(\d+)#post(\d+)$ 
RewriteRule ^threads/([0-9]+)-(.*)$ /threads/$2\.$1/#post-%1? [R=301,NC,L] 

但不幸的是,重寫不起作用。

什麼引發我們送行關於重寫是有查詢和鏈接本身沒有指定PHP文件的多個變量,所以我們不能只使用該解決方案提供了這裏:https://stackoverflow.com/a/2252242/1288397

任何提示如何克服這個特殊的障礙?

+1

URL的哈希部分不是查詢字符串的一部分。 (並且它甚至不向服務器發送。) – CBroe

回答

0

的URL #post-部分永遠不會發送到服務器,它完全保留在瀏覽器的結束,所以沒有辦法匹配反對。幸運的是,帖子ID已在查詢字符串,所以你可以忽略它:

RewriteCond %{QUERY_STRING} ^p=(\d+)&viewfull=(\d+)$ 
RewriteRule ^threads/([0-9]+)-(.*)$ /threads/$2\.$1/#post-%1? [R=301,NC,L] 

的另一件事是,螺紋固定鏈接在你的第二個URL小寫。不確定是否重要,但爲了將文本更改爲小寫,您需要使用Rewrite Maptolower內部函數。您只能在服務器vhost/config中聲明映射,因此如果您無法訪問這些配置文件,則無法使用映射。

0

感謝您清理#post-aspect。

我想你的修改,但鏈接開始變成了:

http://forum.test/threads/warnight-cs-go.119312/%23post-2306618#post2306618

爲了工作,重寫必須

RewriteCond %{QUERY_STRING} ^p=(\d+)&viewfull=(\d+)$ 
RewriteRule ^threads/([0-9]+)-(.*)$ /threads/$2\.$1/#post-%1? [R=301,NC,NE,L] 

注意在附加NE(noscape)標誌結束

這是因爲,默認情況下,特殊字符(如&和?)將被轉換爲他們的十六進制等效。使用[NE]標誌可以防止發生,如下所示:http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_ne