.htaccess重写将目录转换为/ key / value / key / value

时间:2012-01-09 20:04:20

标签: .htaccess url

我之前看到过使用规则将URL上的目录转换为key = value请求查询。

我不知道如何做到这一点,所以我可以有多个这样的对。

例如:

http://www.example.com/mykey/myvalue/mykey2/myvalue2

将映射到:

http://www.example.com?mykey=myvalue&mykey2=myvalue2

感谢。

3 个答案:

答案 0 :(得分:7)

使用此.htaccess代码对基于key/value的URI进行基于递归的转换:

Options +FollowSymLinks -MultiViews
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)(/.*)?$ $3?$1=$2 [N,QSA]
RewriteRule ^(/[^/]+|[^/]+/|/?)$ /index.php [L,QSA]

使用这些规则,http://localhost/n1/v1/n2/v2/n3/v3/n4/v4的网址将被内部重定向到http://localhost/?n4=v4&n3=v3&n2=v2&n1=v1,将每个由/分隔的网址段视为QUERY_STRING的名称 - 值对。但请记住,如果URI没有偶数个段,例如:http://localhost/n1/v1/n2/那么它将被重定向到http://localhost/?n1=v1,丢弃额外的n2。

答案 1 :(得分:0)

我见过这种类型模式的最常见用法是在Zend Framework中,但我相信这是通过Front Controller实现的,即PHP代码。我相信,无法通过mod_rewrite匹配未知数量的匹配。也就是说,如果你知道最多会说3对,你可以使用......

RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?$1=$2 [QSA,L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ /index.php?$1=$2&$3=$4 [QSA,L]
RewriteRule ([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ /index.php?$1=$2&$3=$4&$5=$6 [QSA,L]

...但如果没有已知的最大值,则无法完成。

答案 2 :(得分:0)