mod_rewrite - 将路径转换为查询字符串

时间:2010-08-20 18:25:03

标签: url mod-rewrite

考虑这条规则

RewriteRule ^/models/(.*)/(.*)$ /models?$1=$2 [NC,L]

这会将/models/application/lawnmower重写为/models?appliction=lawnmower

很好,正是我想要的

现在考虑这个规则(最多有6个名称/值对)

RewriteRule ^/models/(.*)/(.*)/(.*)/(.*)$ /models?$1=$2&$3=$4 [NC,L]  

这应该重写

/models/application/lawnmower/series/xp

/models?application=lawnmower&series=xp  

但它确实创造了

/models?application/lawnmower=series&GX=  

最后,我需要做的是获取/ models后面的每个值并将其解析为qs格式的名称/值对

任何想法

1 个答案:

答案 0 :(得分:1)

通过更多信息,您可以使用任意数量的键值对来获取URL,并将它们转换为查询字符串以传递给您的脚本。如果我没记错的话,Gumbo回答了一个类似的问题,带有一种“循环”,允许类似的东西。

但是,正如我相信他当时指出的那样,我现在会向你指出,用mod_rewrite这样做真的不是一个好主意。最好让mod_rewrite重写您的脚本URL:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/models/.*$ /models [NC,L]

...然后解析原始REQUEST_URI值以提取所需的信息。与mod_rewrite相比,您选择的脚本语言是一个更适合此任务的工具。

就修改当前规则而言,我想也许你对服务器的请求有一个尾随斜杠?由于您的(.*)分组可以匹配任何内容(或者没有内容),如果您有三个其他斜杠,它们将贪婪地使用第一个斜杠作为密钥名称的一部分。简单的解决方案是不匹配捕获组中的斜杠:

RewriteRule ^/models/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /models?$1=$2&$3=$4 [NC,L]  

请注意,如果您尝试将此作为一系列六个单独的规则执行此操作,那么您将会耗尽后向引用,因为您可以获得的最多(您定义的)是9。