如何解决用查询中的通配符重写条件
我有一个将/myPage.php?myQueryVar=foo-aRandomString
重写为/myNewPage/foo-aRandomString
的重写条件。我只希望将其应用于查询值中带有连字符的情况,因此我具有一些条件,如下所示:
RewriteCond %{QUERY_STRING} (^|&)myQueryVar=foo-(.*)($|&)
RewriteCond %{THE_REQUEST} ^GET\ /myPage\.php\?myQueryVar=([^\s&]+) [NC]
RewriteRule ^myPage\.php$ /myNewPage/%1? [R=301,L]
我想添加另一个允许/myPage.php?myQueryVar=bar-aRandomString
的规则例外。目前,我不得不简单地克隆上面的代码,然后再次使用它,但是将foo
更改为bar
,如下所示。有没有一种更清洁的方法,而不必具有几乎相同的代码的多行?谢谢。
RewriteCond %{QUERY_STRING} (^|&)myQueryVar=bar-(.*)($|&)
RewriteCond %{THE_REQUEST} ^GET\ /myPage\.php\?myQueryVar=([^\s&]+) [NC]
RewriteRule ^myPage\.php$ /myNewPage/%1? [R=301,L]
解决方法
尝试使用此功能:
RewriteCond %{QUERY_STRING} (^|&)myQueryVar=(foo|bar)-(.*)($|&)
RewriteCond %{THE_REQUEST} ^GET\ /myPage\.php\?myQueryVar=([^\s&]+) [NC]
RewriteRule ^myPage\.php$ /myNewPage/%1? [R=301,L]
(第一个RewriteCond已更改)
基本上,foo
更改为此(foo|bar)
,这意味着:
( # begin of group
foo # a literal 'foo'
| # or
bar # a literal 'bar'
) # end of group
请记住,我们必须将两个选项括在一个组中,因为如果没有,则正则表达式将改为:
(^|&)myQueryVar=foo|bar-(.*)($|&) ==> (^|&)myQueryVar=foo OR bar-(.*)($|&)
此外,如果您不想捕获括号内的内容(这就是它们被称为“捕获组”的原因),则可以使用“非捕获组”代替(?:)
。如果您实际上不需要捕获内部数据,则使用非捕获组是一个好习惯。
此外,您不需要在第一个.*
上握住RewriteCond
的组,因为您确实使用了第二个RewriteCond
的捕获组
因此规则可以像这样更改:
RewriteCond %{QUERY_STRING} (?:^|&)myQueryVar=(?:foo|bar)-.*(?:$|&)
RewriteCond %{THE_REQUEST} ^GET\ /myPage\.php\?myQueryVar=([^\s&]+) [NC]
RewriteRule ^myPage\.php$ /myNewPage/%1? [R=301,L]
但是,即使如此,您也可以通过加入两个正则表达式来一个RewriteCond
:
RewriteCond %{THE_REQUEST} ^GET\ /myPage\.php\?myQueryVar=((?:foo|bar)-[^\s&]+) [NC]
RewriteRule ^myPage\.php$ /myNewPage/%1? [R=301,L]
(请注意,(?:foo|bar)
是一个非捕获组,因为您不需要捕获那一部分,所以需要捕获整个变量
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。