2016-09-14 95 views
1

我正在褪色,需要一些幫助。我使用3周的RewriteRules來完成,我認爲有些事情應該只有一個:我可以將這3個重寫規則合併爲1嗎?

RewriteRule ^([0-9]+)$ /bar/$1.html [R=301,L] 
RewriteRule ^([0-9]+)(-*)$ /bar/$1.html [R=301,L] 
RewriteRule ^([0-9]+)-([0-9]+)$ /bar/$1.html#$2 [R=301,NE,L] 

我需要採取以下網址:

http://foo.com/100 
http://foo.com/100-1 
http://foo.com/200- 
http://foo.com/1999 
http://foo.com/1999-99 

...並重寫它們是這樣的:

http://foo.com/bar/100.html 
http://foo.com/bar/100.html#1 
http://foo.com/bar/200.html 
http://foo.com/bar/1999.html 
http://foo.com/bar/1999.html#99 

我有什麼作品但似乎有點破解。有沒有辦法將這一切結合到一個規則中?

回答

1

我沒有看到將所有三條規則合併爲一條規則的方法,因爲替換結構並不總是相同的,哈希有時會出現,有時不會出現。但是,你可以結合前兩個規則:

RewriteRule ^([0-9]+)-?$ /bar/$1.html [R=301,L] 

第二條規則,以散列符號代替,可以保持原樣:

RewriteRule ^([0-9]+)-([0-9]+)$ /bar/$1.html#$2 [R=301,NE,L] 
+0

哦,謝謝。現在很明顯,你提到了前兩者的結合。很顯然,我一直在看它太久了。 – TunaMaxx

1

可以將所有3條規則組合成一個與此招:

RewriteCond %{REQUEST_URI} ^/(\d+)-?(\d+)?$ 
RewriteCond %1#%2 ^(\d+)#$ [OR] 
RewriteCond %1#%2 ^(\d+)(#\d+)$ 
RewriteRule^/bar/%1.html%2 [R=301,L,NE] 
  • 在第一條件下,我們匹配以數字後跟一個可選的連字符和另一個任選的NU開始正則表達式模式MBER。
  • 接下來的兩個條件是使用[OR]所以只有一個會成立。
  • 對於URI /100,第一個條件將爲true,100將在%1中捕獲,但%2將爲空。
  • 對於URI /100-1,第二個條件將爲true,100將在%1中捕獲,但%2將爲#1
+0

謝謝。我實際上想出了一個類似的解決方案,但在某些情況下被掛上'#'困擾。我知道在那裏是無害的,但我希望有一個神奇的解決方案,在那裏我可以「重複一行」重寫,而不會偶爾出現空白#。 – TunaMaxx

+0

魔法解決方案有可能取出空的'#',將在幾分鐘內更新。 – anubhava

+0

立即嘗試我的更新規則。 – anubhava

相關問題