2016-09-14 79 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

相关问题