【发布时间】:2011-07-19 22:09:51
【问题描述】:
当前状态: 首先,我想指出这个问题与我两天前发布的一个问题非常相关。从那以后,我试图以不同的方式解决我面临的问题,并且遇到了不同的问题。我希望这不构成任何形式的“双重发布”?
我创建了两个似乎独立工作以创建所需效果的 mod 重写规则。如下所示:
RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^(.*/)?([A-Za-z0-9.-]+)_([A-Za-z0-9.-]*) $1?$2=$3&%1 [L]
上述规则采用这样的 URL:
www.site.com/param1/thing/sortorder_5/getparam2_6/
并将其转换为:
www.site.com/param1/thing/?sortorder=5&getparam2_6/
第二条规则如下:
RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^(.*/)?((?:cmd)[^/]*)/((?!(?:cmd)[.+]*)(.+)) $1?$2=$3&%1 [L]
这需要一个这样的 URL:
http://www.site.com/cmd/param1/thing/cmd2/param2/
并将其转换为:
http://www.site.com?cmd=param1/thing&cmd2=param/
期望的结果:
我想合并这两个重写规则,以便我可以执行以下操作:
http://www.site.com/cmd/param1/cmd2/param2/sortorder_5
转换为:
http://www.site.com?cmd=param1&cmd2=param2&sortorder=5
任何告诉我如何开始这样做的人都会非常友善。几天来,我已经尝试了很多 mod 重写代码,但没有运气。我的 regex/mod 重写知识真的没有达到标准,所以对此我深表歉意!整个 mod 重写代码粘贴在下面。谢谢。
RewriteEngine On
# This block works fine in isolation
RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^(.*/)?([A-Za-z0-9.-]+)_([A-Za-z0-9.-]*) $1?$2=$3&%1 [L]
# This block also works fine in isolation
RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^(.*/)?((?:cmd)[^/]*)/((?!(?:cmd)[.+]*)(.+)) $1?$2=$3&%1 [L]
# This block should append the query string to index.php (front controller)
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^.*$ index.php?%1 [L]
【问题讨论】:
-
如果您可以控制
index.php,我建议您只需执行RewriteRule ^(.*)$ ?query=$1 [L,QSA]之类的操作并在脚本中解析查询。这样,除了使请求的解析更容易之外,您不依赖于 mod_rewrite 规则(可以很容易地与其他服务器一起使用)。 -
顺便说一句,你为什么要这样使用
RewriteCond %{QUERY_STRING} (.*)?我建议只在重写规则上使用QSA标志。
标签: regex apache .htaccess mod-rewrite rewrite