2010-08-20 39 views
1

考虑这个规则的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= 

ultimatly,我需要做的就是采取一切遵循/模型值,并将其解析为名称/值对qs形式

任何想法

回答

1

有了更多信息,它可能会带上任意数量的键值对,并将它们转换为查询字符串以传递给您的脚本。如果我没有记错的话,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.

+0

@jason - 我只是指出,如果你的URL变得太复杂,就效率和简单性而言,让脚本执行从URL中解析数据的工作,而不是使用'mod_rewrite'来完成。在这种情况下,您将使用'mod_rewrite'将URL更改为指向您的脚本,然后使用脚本确定键值对应该是什么。 – 2010-08-20 19:07:13

+0

@jason - 哈哈,抓住JavaScript文件。 – 2010-08-20 19:08:49

+0

ahhh ...有道理 – jason 2010-08-20 19:11:08