Apache mod_rewrite到参数的映射路径

时间:2020-08-05 15:57:26

标签: regex apache mod-rewrite url-rewriting isapi-rewrite

我正在从IIS迁移到Apache(在Windows上),并努力适应重写规则(在IIS中使用Helicon ISAPI_Rewrite 3)。

该规则将看起来像目录结构路径的内容映射回一组查询字符串参数。路径中可以有任意数量的参数。

例如

/ basket / param1 / value1 / param2 / value2 / param3 / value3 ...等等...

成为...

/ basket?param1 = value1&param2 = value2&param3 = value3 ...等等...

ISAPI_Rewrite中的规则:

#  This rule simply reverts parameters that appear as folders back to standard parameters
#  e.g. /search-results/search-value/red/results/10 becomes /search-results?search-value=red&results=10

RewriteRule ^/(.*?)/([^/]*)/([^/]*)(/.+)? /$1$4?$2=$3  [NC,LP,QSA]

我首先发现Apache没有'LP'标志,因此将其替换为N = 10作为循环测试...

RewriteRule ^(.*?)/([^/]*)/([^/]*)(/.+)? $1$4?$2=$3 [NC,N=10,QSA]

但是,Apache错误日志显示一遍又一遍地添加相同的参数,直到达到N标志上的循环数为止,以HTTP 500错误结束。

有什么想法我要去哪里吗?!?

1 个答案:

答案 0 :(得分:0)

做了大量的工作并吸引了我的Google Foo之后,我在另一个Stack Overflow评论中找到了解决所有问题的方法...

https://stackoverflow.com/a/5520004/14054970

本质上...

显然,重新添加mod_rewrite存在问题 某些情况下的后固定零件 https://issues.apache.org/bugzilla/show_bug.cgi?id=38642

问题:

如果.htaccess文件中的多个RewriteRules匹配,则不需要 PATH_INFO的副本可能会累积在URI的末尾。

如果您使用的是Apache 2.2.12或更高版本,则可以使用DPI标志来 防止这种http://httpd.apache.org/docs/2.2/rewrite/flags.html

我正在使用Apache 2.4,所以我的重写规则现在如下所示(为了安全起见,我将DPI标志添加到所有规则中)...

RewriteRule ^(.*?)/([^/]*)/([^/]*)(/.+)? $1$4?$2=$3  [NC,N=1000,QSA,DPI]