我有一个包含以下内容的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
标志。 否则,请看这里:
在jquery设置为url之前,你必须像这样编码,这将编码%和/两个…..“ encodeURI(encodeURI(encodeURIComponent('your string'))); ”
在PHP或浏览页面,你必须解码如下
urldecode(urldecode(htmlspecialchars('your encoded string',ENT_QUOTES)))