我有以下重写规则:
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
重写符合“事件”页面显示该页面。
基本上,我需要知道如何解决这个问题。
答案 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]