IIRF / APACHE REWRITE从条件中删除查询字符串

时间:2013-01-12 23:04:15

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

我有以下重写规则:

RewriteRule ^/events$ /pagebase.php?pbid=3627 [QSA,L,I]
RewriteRule ^/events-list$ /pagebase.php?pbid=3663 [QSA,L,I]
RewriteRule ^/bob2013$ /pagebase.php?pbid=3688 [QSA,L,I]
RewriteRule ^/contact-us$ /pagebase.php?pbid=3634 [QSA,L,I]
RewriteRule ^/detail$ /pagebase.php?pbid=3890 [QSA,L,I]

在我需要传递查询字符串之前,哪个工作很好。

所以,如果我输入

http://www.domain.com/events 它完美地运作。

但如果我输入

http://www.domain.com/events?type=1

然后重写失败,因为它不再匹配“事件”。

但是,如果我删除美元符号,那么它可以正常工作。查询字符串类型正确传递。

像这样。

RewriteRule ^/events$ /pagebase.php?pbid=3627 [QSA,L,I]

然而,问题是,如果有人键入事件列表的URL。

http://www.domain.com/events-list

重写符合“事件”页面显示该页面。

基本上,我需要知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是相应地订购规则:一般规则之前的特定规则

由于第一条规则(最后没有$)包含第二条规则,所以将第二条规则放在第一条规则之前:

RewriteRule ^/events-list /pagebase.php?pbid=3663 [QSA,L,I]
RewriteRule ^/events      /pagebase.php?pbid=3627 [QSA,L,I]

现在,任何以/events-list开头的网址都会被重写为pbid=3663

但是,为了防止匹配/events-anything等网址,最好在规则中包含可选查询字符串的匹配项:

RewriteRule ^/events-list(\?.*)?$ /pagebase.php?pbid=3663 [QSA,L,I]
RewriteRule ^/events(\?.*)?$      /pagebase.php?pbid=3627 [QSA,L,I]