两个规则在一次匹配URL时的Apache RewriteRule意外行为(添加路径信息后缀)

时间:2012-05-27 13:17:54

标签: regex mod-rewrite url-rewriting apache2

我正在使用apache rewrite_mod(Apache / 2.2.17 Win32)并遇到非常奇怪的rewriteRule行为。

我的脚本主要从nice url重写无名过滤器参数f1 .. f<infinity>,在循环中将它们添加为查询变量,添加路径作为查询和页码。

它完美无瑕,但如果我添加另一条规则(脚本中的最后一条规则)

RewriteRule   ^(.+)\.html$                       /index.php?path=$1.html [QSA]

对于另一种情况,它会在脚本开始时更改rewriterule的执行。




输入网址:

http://testing.loc/some/thing/index0-f1-nice-cars-f2-planes-f3-karts-f4-bike.html

所有重写后PHP中的预期结果:

$_SERVER[QUERY_STRING] => path=some/thing/&page=0&f1=nice-cars&f2=planes&f3=karts&f4=bike
$_SERVER[SCRIPT_NAME] => /index.php

脚本看起来像这样(下一部分功能完美无缺):

# from: some/thing/index0-f1-nice-cars-f2-planes-f3-karts-f4-bike.html
# to:   some/thing/index0.html?f=-f1-nice-cars-f2-planes-f3-karts-f4-bike

RewriteRule   ^(.*/?index[0-9]*)((?:-f[0-9]+-.+?)+)\.html$   /$1.html?f=$2 [QSA]

# from: some/thing/index0.html?f=-f1-nice-cars-f2-planes-f3-karts-f4-bike
# to    index.php?path=some/thing/&page=0&f=-f1-nice-cars-f2-planes-f3-karts-f4-bike

#              (   $1   )     (  $2  )
RewriteRule   ^(.+/{0,1})index([0-9]*)\.html$    /index.php?path=$1&page=$2 [QSA]

# while in f is something like "f1-nice-cars" (for example)
# remove "f1-nice-cars" from f and add as query "f1=nice-cars"

#                              (%1)    (   %2  ) ( %3)(       %4       )
RewriteCond   %{QUERY_STRING} ^(.*)&f=-(f[0-9]+)-(.+?)((?:-f[0-9]+-.+)*)$ 
RewriteRule   ^index\.php$                       /index.php?%1&%2=%3&f=%4 [L]

# remove empty "f=" from query

RewriteCond   %{QUERY_STRING} ^(.*)&f=$ 
RewriteRule   ^index\.php$                       /index.php?%1

这里,规则是url的形状:

index.php?path=some/thing/&page=0&f1=nice-cars&f2=planes&f3=karts&f4=bike

没有脚本中的下一个规则就是功能完善。但是如果我添加它,这个规则本身什么都不做,但是在脚本开始时,rewrite_mod会为了更多的东西添加更多内容。

# rewrite rule for other paths without filters

RewriteRule   ^(.+)\.html$                       /index.php?path=$1.html [QSA]

实际上运行后所有脚本结果都是:

index.php?path=/some/thing/index0.html/some/thing/index0&f1=nice-cars&f2=planes&f3=karts&f4=bike

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的方法。 当2个规则在.htaccess的一次传递中匹配URL时,则apache rewrite_mod使用方法“添加路径信息postfix”(它类似于bug或功能),这会破坏请求的路径。因此,当我将flag [L]添加到该2个规则时,结果就可以了。

我认为apache按顺序传递.htaccess并且在下一个规则上无关紧要......