2

我有表单的网址

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

我正在尝试将它们转换为常规的 key=value 形式,但无法弄清楚。

你能帮我把它转换成

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

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

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

提前致谢,

4

1 回答 1

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 条规则检查给定请求是否针对 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/

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

于 2012-09-11T18:42:36.360 回答