Apache 重写Gmail电子邮件地址规则

Apache 重写Gmail电子邮件地址规则,apache,mod-rewrite,Apache,Mod Rewrite,我正在尝试为取消订阅url创建重写规则,以便url https://example.com/unsubscribe/myemail@example.com/ 将被重新写入 https://example.com/unsubscribe.php?email=myemail@example.com 在过去,我一直使用以下规则,没有任何问题 ReWriteRule ^unsubscribe/(.*)/?$ /unsubscribe.php?email=$1 [NC,L] 然而,当最近进行测试时,

我正在尝试为取消订阅url创建重写规则,以便url

https://example.com/unsubscribe/myemail@example.com/
将被重新写入

https://example.com/unsubscribe.php?email=myemail@example.com
在过去,我一直使用以下规则,没有任何问题

ReWriteRule ^unsubscribe/(.*)/?$ /unsubscribe.php?email=$1 [NC,L]
然而,当最近进行测试时,它似乎正在替换“+”字符(正如gmail标签中常用的那样,例如“myemail”)+spam@example.com),创建与用户输入的电子邮件地址不同的电子邮件地址。这是一个问题。您可以在此处看到一个示例:

我真的不明白为什么会发生这种情况,因为“(*)”过滤器应该允许任何字符多次出现,不是吗


如果您有任何建议,我们将不胜感激。

您可以在规则中使用mod rewrite B标志:

ReWriteRule ^unsubscribe/(.*)/?$ /unsubscribe.php?email=$1 [NC,L,B]
从apache mod rewrite flag手册:

B]标志指示重写规则在应用转换之前转义非字母数字字符。
在2.4.26及更高版本中,您可以通过列出反引用中的特定字符:[B=#?;]来限制转义。注意:空格字符可以在要转义的字符列表中使用,但不能是列表中的最后一个字符。
mod_rewrite必须在映射URL之前取消对URL的扫描,因此反向引用在应用时取消扫描