我有旧的和新的 URL 路径,我想编写重定向规则,因此有 2 个带有查询字符串的旧路径版本:
/cgi-bin/something?123
/cgi-bin/something?keywords=123&offset=120
都重定向到新路径:
/catalogsearch/advanced/result/?something[]=789
下面是我写的 2 条规则(我使用映射文件来使 ID 解析为 123 -> 789)
RewriteCond %{REQUEST_URI} /cgi-bin/something?
RewriteCond %{QUERY_STRING} ^([0-9]{1,})$
RewriteRule "^cgi-bin/something?" "/catalogsearch/advanced/result/?something\[\]=${something:%1|NOTFOUND}" [R=307,L]
RewriteCond %{REQUEST_URI} /cgi-bin/something?
RewriteCond %{QUERY_STRING} ^keywords=([0-9]{1,})$
RewriteRule "^cgi-bin/something?" "/catalogsearch/advanced/result/?something\[\]=${something:%1|NOTFOUND}" [R=307,L]
第一部分是路径的第一个版本,第二部分是其他版本(带有关键字)。第一部分工作正常,第二部分似乎与查询字符串不匹配。
如何修复?
答案1
对于你的第二个重写表达式
RewriteCond %{REQUEST_URI} /cgi-bin/something?
RewriteCond %{QUERY_STRING} ^keywords=([0-9]{1,})$
此匹配将匹配字符串
/cgi-bin/something?keywords=123
但会不是匹配
/cgi-bin/something?keywords=123&offset=120
您使用的正则表达式中^keywords=([0-9]{1,})$
有一个美元符号 ( $
),表示在由 0 到 9 之间的一个或多个数字组成的组之后,紧接着是行尾。
&offset=120
URI 末尾的部分导致角色不匹配。
您可以按如下方式更改正则表达式,这将在行尾之前的数字组后添加零个或多个字符。但是,这可能也不是您想要的。这取决于您想要重写的 URL。确定之后您想要匹配的内容(您想要“&offset”吗?)并相应地修改正则表达式。
RewriteCond %{QUERY_STRING} ^keywords=([0-9]{1,}).*$
PS-我发现本网站对于可视化正则表达式很有用。