.htaccess 在重写规则中将?替换为/

zynd9foi  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(86)

我需要实现下面给出的Map:

https://www.domain1.com/open.html?cuSDyh&utm_medium=rep-email

to 

https://www.domain2.com/c/cuSDyh?utm_medium=rep-email

我写了一个重写规则来实现这一点,这似乎是错误的,因为“?”在最终结果中没有被替换。

RewriteRule ^/open.html?(.*)$ https://www.domain2.com/c/$1 [NC,R=301,L]

有人能帮我找到正确的重写规则吗?

2mbi3lxu

2mbi3lxu1#

RewriteRule ^/open.html?(.*)$ https://www.domain2.com/c/$1 [NC,R=301,L]

这里有几个问题使规则无法工作:

  • RewriteRulepattern(第一个参数)仅与URL路径匹配,特别是不包括查询字符串。要匹配查询字符串,您需要一个附加的 conditionRewriteCond指令)并与QUERY_STRING服务器变量匹配。
  • RewriteRule * 模式 * 匹配的URL路径不是以斜杠开头。

请注意,RewriteRulepattern 是一个正则表达式。上面正则表达式中未转义的?是一个特殊的 meta字符(* 量词 *),它使前面的标记 optional 成为可选的。因此,在您的示例中,l是可选的。(尽管您无论如何都要匹配后面的所有内容,所以?是完全多余的。)

FROM: /open.html?cuSDyh&utm_medium=rep-email
TO:   /c/cuSDyh?utm_medium=rep-email

我假设第一个URL参数(例如您的示例中的cuSDyh)仅由字母(小写或大写)组成,并且不是name=value对(根据您的示例)。
请尝试以下方法:

RewriteCond %{QUERY_STRING} ^([a-z]+)(?:&|$)(.*) [NC]
RewriteRule ^open\.html$ /c/%1?%2 [NE,R=302,L]

%1%2反向引用与前面的 CondPattern 中捕获的子组匹配。例如,%1与第一个URL参数匹配(例如,示例中的cuSDyh),%2与所有后续URL参数匹配(不包括分隔符)。
RewriteRule指令上需要NE标志(而不是NC),以防止URL的查询字符串部分在重定向响应中进行双重URL编码。(QUERY_STRING变量已经进行了URL编码。)
如果在第一个URL参数之后没有其他的URL参数,那么上述规则实际上会附加一个空的查询字符串(由尾随的?表示)。但是,尾随的?会被Apache在重定向响应中自动删除。
为了避免潜在的缓存问题,请始终首先使用302(临时)重定向进行测试,并且在测试完成后仅更改为301(永久)重定向(如果这是目的)。

相关问题