【问题标题】:.htaccess RewriteRule to encode ®.htaccess RewriteRule 编码 ®
【发布时间】:2019-06-13 15:05:51
【问题描述】:

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

要重写的url示例是:

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

这需要重写为:

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

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

有没有人可以帮助我使用 RewriteRule 表达式来处理这种情况?谢谢。

【问题讨论】:

  • 我不确定这里发生了什么顺序,但如果问题是 IE,那么在 IE 尝试发出请求之前,URL 需要在 HTML 中正确地进行 URL 编码。当.htaccess 能够处理请求时,IE 已经发送(或尝试发送)?那么,为时已晚?

标签: apache .htaccess mod-rewrite


【解决方案1】:

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

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

(*1 虽然如果请求在 IE 中 refereshed 则 IE 似乎正在用 ® 符号代替 U+FFFD “替换字符” - 尽管开发工具显示 ® 符号?!)

如果请求到达您的服务器,则可以修复此问题。 (虽然请求是严格无效的。)

如果请求到达您的应用程序,那么您也应该能够在应用程序代码本身中处理它 - 但也许您无法控制它?

如果请求 URL 的查询字符串部分中包含未编码的 ® 符号,请尝试在您的 .htaccess 文件顶部“重定向”(而不是“重写”)请求,将其替换为在重定向响应中使用%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 一开始就发送这个未编码的字符。但是您可能需要对这个字符进行编码而不管浏览器如何,因为可能是您的应用程序因此而中断?

更新: ...现在是 'training/some-training/subscribe/',但 url 并不总是有这个文本,它可以是任何东西。

如果 URL 路径可以是 anything,则让它匹配 anything

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

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

RewriteRule 之后的第一部分不应该重写字符(®)吗?

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

【讨论】:

  • 首先感谢您的帮助!!但是,我不确定这将如何工作.. RewriteRule 之后的第一部分中不应该重写字符 (®) 吗?现在是 'training/some-training/subscribe/',但是 url 并不总是有这个文本,它可以是任何东西。
  • 要重写的字符 (®) 不是 URL 路径的一部分,它是查询字符串的一部分,因此这与“RewriteRule 之后的第一部分”不匹配(即RewriteRule 模式)。如果 URL 路径可以是“任何东西”,那么您可以使正则表达式更通用。我已经更新了我的答案。
  • 我无法让它工作,但我们决定采用另一种方法。无论如何感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 2014-12-18
  • 2023-03-28
  • 2011-04-23
相关资源
最近更新 更多