我希望为我的标记系统提供漂亮的 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(使用前将#替换为@)