.htaccess RewriteRule进行编码®

时间:2019-06-13 15:05:51

标签: apache .htaccess mod-rewrite

我需要使用.htaccess文件中的RewriteRule将url参数中的所有®重写为%C2%AE(UTF-8)。我需要这样做是因为Internet Explorer不接受此特殊字符,而其他浏览器则接受。网址无法更改,因为它是在我无法触及的范围内生成的。

要重写的网址示例为:

update data set `date` = ADDTIME(`date`, '01:00:00') WHERE `date` > '2019-03-31 02:00:00' ORDER By date DESC

这需要重写为:

https://www.example.com/training/some-training/subscribe/?t=Some+Training®&id=81

®可以在参数中的任何位置发生。如果可能的话,最好只在Internet Explorer上重写它,但这也许只是一厢情愿。

有人可以在这种情况下使用RewriteRule表达式来帮助我吗?谢谢。

1 个答案:

答案 0 :(得分:2)

  

我需要这个,因为Internet Explorer不接受此特殊字符,而其他浏览器则接受。

如果IE浏览器“不接受此特殊字符”,那么您将无能为力(正如我的评论中所述)。但是,在我对IE11的测试中,当发出请求 * 1 时,似乎IE只是“简单地”不是URL编码®符号。其他浏览器正在通过将此char编码为%C2%AE作为请求的一部分来提供帮助和“修复” URL。

* 1 ,尽管如果在IE中请求是 refesheshed ,则IE似乎将®符号替换为U + FFFD“替换字符”-尽管开发工具显示了®符号?!)

如果请求已到达您的服务器,则可以解决此问题。 (尽管该请求严格无效。)

如果请求正在到达您的应用程序,那么您还应该能够在应用程序代码本身中处理此问题-但也许您无法对此进行控制?

如果请求的查询字符串部分中包含未编码的.htaccess符号,请尝试在®文件顶部执行以下操作,以“重定向”(而不是“重写”)请求URL,在重定向响应中将其替换为%C2%AE

RewriteEngine On

RewriteCond %{QUERY_STRING} (.+)®(.*)
RewriteRule ^training/some-training/subscribe/$ /$0?%1\%C2\%AE%2 [R,L,NE]

®符号可以在 CondPattern 中逐字表示。

$0是对整个URL路径的反向引用-以节省键入内容。

%1%2是对®符号前后的字符串的反向引用。

\%C2\%AE-注意反斜杠转义的%字符代表文字%,以避免与形式为%n的反向引用产生混淆。 (虽然在这种情况下应该没有问题,但最好是明确的。)

NEnoescape)标志可防止对 susbstitution 字符串进行双重编码。

  

最好只需要在Internet Explorer上重写

似乎只有IE首先发送未编码的字符。但是您可能需要对这个字符进行编码,而与浏览器无关,因为可能是因为它导致了应用程序的中断?

  

更新:...现在是“培训/一些培训/订阅/”,但网址并不总是包含此文本,可以是任何内容。

如果URL路径可以是任何,则使其匹配任何

RewriteCond %{QUERY_STRING} (.+)®(.*)
RewriteRule .* /$0?%1\%C2\%AE%2 [R,L,NE]

但是,最好限制尽可能多,因为现在将对每个请求进行处理。

  

是否应该在RewriteRule之后的第一部分中重写字符(®)?

RewriteRule 模式RewriteRule指令的第一个参数)仅与URL路径匹配-这明显排除了URL的查询字符串部分。这就是为什么我们需要使用附加的RewriteCond condition )指令来检查(并捕获)URL的查询字符串部分的原因。