Apache URL重写,具有未定义数量的参数的URL

时间:2012-09-08 19:59:04

标签: apache .htaccess mod-rewrite url-rewriting

我有

形式的网址
http://www.site.com/someCompany/someEmployee/name/someName/age/someAge/.../keyN/someValueN/

我正在尝试将它们转换为常规键=值形式,但无法弄明白。

你能帮我转换成

吗?
http://www.site.com/someCompany/someEmployee?name=someName&age=someAge&...&keyN=someValueN/

基本上,可以有任意数量的键和值,并在URL中指定为/ key / value /

我阅读了很多示例和教程,但没有一个解释处理具有可变数量参数的URL。

提前致谢,

1 个答案:

答案 0 :(得分:0)

确保已打开mod_rewrite。

在文档根目录中的htaccess文件中,添加这些文件(最好是您可能拥有的其他规则):

# Start converting query parameters to path
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+)/(.+?)\?[^\ ]+
RewriteCond %{QUERY_STRING} ^([^=]+)=([^&]+)&?(.*)$
RewriteRule ^([^/]+)/(.+)$ /$1/$2/%1/%2?%3 [L]

# done converting, redirect browser
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+)/(.+?)\?[^\ ]+
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^([^/]+)/(.+)$ /$1/$2 [R=301,L]


# internally rewrite paths to query strings
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)(.*) /$1/$2$5?$3=$4 [L,QSA]

# only someCompany/someEmployee left, pass it through
RewriteRule ^([^/]+)/([^/]+)/?$ /$1/$2 [L,R]

这看起来有点复杂。但前两个规则检查给定请求是否包含2个文件夹(例如/something/somethingelse)和查询字符串(?之后的所有内容),然后匹配名称/值对并将它们构造到URI中-路径。当查询字符串为空时,将浏览器重定向到新URL(不带查询字符串)。当有人将URL输入浏览器时,这就是这样:

http://www.site.com/someCompany/someEmployee?name=someName&age=someAge&keyN=someValueN

浏览器被重定向,因此地址栏中的URL如下所示:

http://www.site.com/someCompany/someEmployee/name/someName/age/someAge/keyN/someValueN/

然后第二组规则采用路径层次结构,保留前两个文件夹中的任何内容(例如/fooCompany/barEmployee),并将每个2个文件夹更改为查询字符串中的名称/值对。基本上颠倒前两个规则的作用,但它不会重定向浏览器。它只会在内部重写URI。