【发布时间】:2012-02-06 08:14:17
【问题描述】:
我以前见过使用规则将 URL 上的目录转换为 key=value 请求查询的地方。
我不知道该怎么做,所以我可以拥有不止一对。
例如:
http://www.example.com/mykey/myvalue/mykey2/myvalue2
将映射到:
http://www.example.com?mykey=myvalue&mykey2=myvalue2
谢谢。
【问题讨论】:
我以前见过使用规则将 URL 上的目录转换为 key=value 请求查询的地方。
我不知道该怎么做,所以我可以拥有不止一对。
例如:
http://www.example.com/mykey/myvalue/mykey2/myvalue2
将映射到:
http://www.example.com?mykey=myvalue&mykey2=myvalue2
谢谢。
【问题讨论】:
我见过的这种模式最常见的用法是在 Zend 框架中,但我相信这是通过前端控制器实现的,即 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]
...但是如果没有已知的最大值,则无法完成。
【讨论】:
使用此 .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 的 URL 将在内部重定向到 http://localhost/?n4=v4&n3=v3&n2=v2&n1=v1,将由 / 分隔的每对 URL 段视为 QUERY_STRING 的名称-值对。但请记住,如果 URI 没有偶数个段,例如:http://localhost/n1/v1/n2/,那么它将被重定向到 http://localhost/?n1=v1,丢弃额外的 n2。
【讨论】:
http://localhost/rewrite/n1/v1/n2/v2/
RewriteRule ^(rewrite)/([^/]*)/([^/]*)(/.*)?$ /$1/$4?$2=$3 [L,QSA,NC]
RewriteEngine On RewriteRule ^(data)/([^/]*)/([^/]*)(/.*)?$ /datahandler.php/$1/$4?$2=$3 [L,QSA,NC] ?
【讨论】: