我需要使用.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表达式来帮助我吗?谢谢。
答案 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
的反向引用产生混淆。 (虽然在这种情况下应该没有问题,但最好是明确的。)
NE
(noescape
)标志可防止对 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的查询字符串部分的原因。