当前位置:  开发笔记 > 编程语言 > 正文

如何使用mod_rewrite和Apache编码特殊字符?

如何解决《如何使用mod_rewrite和Apache编码特殊字符?》经验,为你挑选了2个好方法。

我想为我的标签系统,简洁的URL与所有的特殊字符一起:+,&,#,%,和=.有没有办法用mod_rewrite执行此操作而无需对链接进行双重编码?

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

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

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

会触发以下RewriteRule:

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

而tag的值将是"c ++"

apache/mod_rewrite的正常操作不能像这样工作,因为它似乎将加号转换为空格.如果我将加号双重编码为​​'%252B',那么我会得到所需的结果 - 但是它会使得网页看起来很混乱,而且对我来说似乎很不好看.



1> bobince..:

apache/mod_rewrite的正常操作不能像这样工作,因为它似乎将加号转换为空格.

我认为这不是正在发生的事情.Apache正在将%2Bs解码为路径部分中的+ s,因为+是那里的有效字符.它在让mod_rewrite查看请求之前执行此操作.

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

所以PHP的表单读取代码接收'c ++'并将其作为C空间空间转储到_GET中.

看起来这种方式是使用重写标志'B'.请参阅http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteflags - 奇怪的是它使用了或多或少相同的示例!

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


注意:自Apache 2.2起,B标志可用.

2> David Z..:

我不确定我理解你在问什么,但NEApache RewriteRule指令的(noescape)标志可能对你有用.基本上,它可以防止mod_rewrite在您提供的替换模式中自动转义特殊字符.Apache 2.2文档中给出的示例是

RewriteRule /foo/(.*) /bar/arg=P1\%3d$1 [R,NE]

例如,它将转向/foo/zed重定向/bar/arg=P1%3dzed,以便脚本/bar将看到一个以arg值命名的查询参数P1=zed,如果它在其中查找PATH_INFO(好吧,那不是真正的查询参数,所以起诉我;-P).

至少,我认为它是如何运作的...我自己从未使用过那个特定的旗帜.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有