2013-05-18 35 views
0

而不是寫2個重寫規則指向同一個頁面的聲明,我雖然我將能夠與使用或陳述一個規則來做到這一點(|):使用或(|)在.htaccess重寫規則

RewriteRule ^([\d]+)-post[\d]*\.html|#post([\d]+) /post.php?p=$1.html [R=301,NC,L] 

有一個額外的$ 2也試圖在最後,因爲只有一個無論如何都將顯示出來:

RewriteRule ^([\d]+)-post[\d]*\.html|#post([\d]+) /post.php?p=$1$2.html [R=301,NC,L] 

上述原則,這將很好地工作:

site.com/14729-post9.html 

然而,這不工作(即使在這裏測試,應該工作:http://regexpal.com/):

site.com/post.php?p=14729#post14729 

是否有實際的方式,使其工作或者我只需要創建2個獨立的規則?

順便說一句,這是更強的服務器的方式嗎?

回答

1

好吧,您必須明白,文檔中的命名鏈接(如#post14729)從不會被瀏覽器傳遞到服務器。當鏈接包含文檔中指定的鏈接時,例如:假設您單擊<a href='http://some.host.com/foo.php?id=1&bar=2#post250'>some link</a>。在將GET發送到some.host.com時,瀏覽器剝離#post250部分,並僅發送變量id = 1和bar = 2的URL /foo.php。當GET的結果回到瀏覽器時,它將搜索內容中名爲錨點的'#post250',並在需要時滾動顯示它。沒有一些JavaScript欺騙,'#post250'不能被髮送回瀏覽器。

你的RewriteEngine並沒有真的看到你的'#post14729'。

0

這裏是一個主要問題。

URL的#post14729部分稱爲一個URL Fragment,這是從來沒有發送到服務器,因此,你不能比賽反對它,因爲它根本不存在。所以你的正則表達式的第二部分:#post([\d]+)永遠不會匹配。