用于将路径转换为查询字符串的URL重写

时间:2014-05-02 21:53:26

标签: apache url-rewriting

我尝试将网址设为如下

http://domain/d1/d2/k1/val1/k2/val2/k3/val3 

http://domain/index.php?one=d1&two=d2&k1=val1&k2=val2&k3=val3

上面的一个和两个是固定键,路径的其余部分用于键值对。 当我在/ d1 / d2 /之后附加了更多的键值对(超过三个)时,如何写出URL重写规则?

更新#1:

以下是我到目前为止的情况。我不能在前两个文件夹的末尾添加动态键值对。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !\.(css|png|jpe?g|gif)$ [NC]
RewriteCond %{REQUEST_URI} !index\.php [NC]
RewriteRule  ^([^/]+)/([^/]+) /index.php?one=$1&two=$2 [QSA,L]

我正在考虑添加一个文件夹“查询”(见下文)以帮助键值对的模式匹配,因为您知道在查询之后所有文件夹都是关于键值对的。但是,我不能走得更远。

http://domain/d1/d2/query/k1/val1/k2/val2/k3/val3 

2 个答案:

答案 0 :(得分:0)

诀窍是遍历重写规则,直到替换目录的所有元素。首先更改所有键/值对,然后更改d1和d2:

# Convert key/value pairs at end of line. Loop (N) until path is just two levels deep
RewriteCond %{REQUEST_URI} ^/(\w+)/(\w+)
RewriteRule (.+)/(\w+)/(\w+)$ $1?$2=$3 [QSA,N]

# Replace two final paths to query string and append to /index.php
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule /(\w+)/(\w+) /index.php?one=$1&two=$2 [QSA]

答案 1 :(得分:0)

另一种方法是将所有请求重定向到/index.php,并将原始路径作为查询字符串附加。然后,您可以使用PHP轻松检查原始路径的元素。

请参阅https://stackoverflow.com/a/8019730/1554386