如何在 Apache 中使用 mod_rewrite 对特殊字符进行编码?

2024-01-06

我希望为我的标记系统提供漂亮的 URL 以及所有特殊字符:+, &, #, %, and =。有没有办法用 mod_rewrite 来做到这一点,而不必对链接进行双重编码?

我注意到,delicious.com 和 stackoverflow 似乎能够处理单编码的特殊字符。神奇的公式是什么?

这是我想要发生的事情的一个例子:

http://www.example.com/tag/c%2b%2b

将触发以下 RewriteRule:

RewriteRule ^tag/(.*)   script.php?tag=$1

标签的值将是“c++”

apache/mod_rewrite 的正常操作不是这样工作的,因为它似乎将加号变成了空格。如果我将加号双重编码为​​“%252B”,那么我会得到所需的结果- 然而它会导致 URL 变得混乱,对我来说似乎很 hack。


apache/mod_rewrite 的正常操作不是这样工作的,因为它似乎将加号变成了空格。

我认为实际情况并非如此。 Apache 正在将路径部分中的 %2B 解码为 + ,因为 + 是其中的有效字符。它在让 mod_rewrite 查看请求之前执行此操作。

然后 mod_rewrite 将您的请求 '/tag/c++' 更改为 'script.php?tag=c++'。但在 application/x-www-form-encoded 格式的查询字符串组件中,转义规则与路径部分中应用的转义规则略有不同。特别是,“+”是空格的简写(也可以编码为“%20”,但这是我们现在永远无法更改的旧行为)。

因此 PHP 的表单读取代码接收“c++”并将其作为 C-space-space 转储到您的 _GET 中。

看起来解决这个问题的方法是使用重写标志“B”。看http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteflags http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteflags- 奇怪的是它使用了或多或少相同的例子!

RewriteRule ^tag/(.*)$ /script.php?tag=$1 [B]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Apache 中使用 mod_rewrite 对特殊字符进行编码? 的相关文章

随机推荐