Apache:url中的%25(400错误请求)

我有一个包含以下内容的url:

/somepath/morestuff/ohno%25foobar 

出于某种原因,apache报告了一个400错误的请求(它与%25有关)。 我正在使用mod_rewrite重写path指向我的codeigniter实例,但它甚至没有得到codeigniter,它只是默认的apache错误。

有任何想法吗?

我怀疑你正在使用PATH_INFO来处理你的CodeIgniter请求。 因此,您的.htaccess文件包含一个与此类似的规则集:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ index.php/$0 [L] 

mod_rewrite测试你的URL时,它们已经被解码为自然字符格式,所以在这种情况下, %25已经变成了% 。 当您应用此规则时,反向引用实际上包含文本somepath/morestuff/ohno%foobar ,默认情况下不会重新编码。 Apache不知道你在/index.php/somepath/morestuff/ohno%foobar和扼流器的请求路径中做了什么,会给你那个错误。

如果您运行的是Apache 2.2, mod_rewrite为此添加了B标志,允许您自动转义重写到您的URL的反向引用。 将其添加到当前的标志列表应该解决这种情况下的问题:

 RewriteRule ^.*$ index.php/$0 [B,L] 

在之前的Apache版本mod_rewrite ,也有一个可以作为内部映射的escape映射RewriteMap ,但不幸的是,这个映射必须在服务器或虚拟服务器配置级别启用,所以如果你在共享主机上运行你的站点, 。 它做同样的事情,虽然有点故意。

在你的服务器/虚拟服务器配置中:

 RewriteMap escape int:escape 

那么,无论你在哪里定义你的规则:

 RewriteRule ^.*$ index.php/${escape:$0} [L] 

请记住,CodeIgniter不需要使用PATH_INFO来获取请求信息,如果你没有使用mod_rewrite做其他的转换(并且完全避免这种头痛),那么使用REQUEST_URI是完全可以接受的。 我认为默认情况下CodeIgniter被设置为从AUTO获取请求(假设我没有得到我的框架混淆),所以根本不需要用路径信息重写请求到URL就足以做出改变。

Apache 2.2.12+,只是使用B标志。 否则,请看这里:

http://www.dracos.co.uk/code/apache-rewrite-problem/

在jquery设置为url之前,你必须像这样编码,这将编码%和/两个…..“ encodeURI(encodeURI(encodeURIComponent('your string')));

在PHP或浏览页面,你必须解码如下

urldecode(urldecode(htmlspecialchars('your encoded string',ENT_QUOTES)))