我有一个包含以下内容的网址:
/somepath/morestuff/ohno%25foobar
由于某些原因,apache报告了400个错误请求(它与%25有关)。我使用mod_rewrite重写路径指向我的codeigniter实例,但它甚至没有得到codeigniter,它只是默认的apache错误。
有什么想法吗?
答案 0 :(得分:12)
我怀疑您使用PATH_INFO
来处理CodeIgniter请求。因此,您的.htaccess
文件包含与此类似的规则集:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php/$0 [L]
当mod_rewrite
测试您的网址时,它们已经被解码为自然字符格式,因此在这种情况下,%25
变为%
。应用此规则时,反向引用实际上包含文字文本somepath/morestuff/ohno%foobar
,默认情况下不重新编码。 Apache不知道%
在/index.php/somepath/morestuff/ohno%foobar
和chokes的请求路径中做了什么,给你这个错误。
如果您正在运行Apache 2.2,mod_rewrite
为此添加了B
标志,允许您自动转义重写到您的URL的反向引用。将其添加到当前标志列表应解决此问题:
RewriteRule ^.*$ index.php/$0 [B,L]
还有escape
RewriteMap
可用作mod_rewrite
以前的Apache版本的内部地图,但不幸的是,必须在服务器或虚拟服务器配置级别启用此地图,如果您在共享主机上运行您的网站,则可能无法使用。它做了同样的事情,虽然有点故意。
在您的服务器/虚拟服务器配置中:
RewriteMap escape int:escape
然后,无论您在何处定义规则:
RewriteRule ^.*$ index.php/${escape:$0} [L]
请注意,CodeIgniter不需要使用PATH_INFO
来获取请求信息,如果您没有使用REQUEST_URI
来执行任何操作,那么使用mod_rewrite
完全可以接受其他转变(并完全避免这种头痛)。我认为默认情况下,CodeIgniter设置为从AUTO
获取请求(假设我没有混淆我的框架),所以根本不用路径信息重写对URL的请求就足以进行更改。
答案 1 :(得分:2)
Apache 2.2.12+,只需使用B
标志。否则,请看这里:
答案 2 :(得分:1)
在设置为url之前的jquery中,你必须像这样编码 这将编码%和/两个..... “ encodeURI(encodeURI(encodeURIComponent('your string'))); ”
在php或查看页面上,你必须解码如下
urldecode(urldecode(htmlspecialchars('your encoded string',ENT_QUOTES)))