Apache:url中的%25(400 Bad Request)

Ken*_*uys 7 apache mod-rewrite http

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

/somepath/morestuff/ohno%25foobar
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Tim*_*one 12

我怀疑你是PATH_INFO用来处理你的CodeIgniter请求.因此,您的.htaccess文件包含一个类似于以下内容的规则集:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php/$0 [L]
Run Code Online (Sandbox Code Playgroud)

mod_rewrite测试您的URL时,它们已经被解码为它们的自然字符格式,所以在这种情况下%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]
Run Code Online (Sandbox Code Playgroud)

还有一个escape RewriteMap可用作以前Apache版本的内部地图mod_rewrite,但不幸的是,这个地图必须在服务器或虚拟服务器配置级别启用,因此如果您在共享主机上运行您的站点,则可能无法使用.它做了同样的事情,虽然有点故意.

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

RewriteMap escape int:escape
Run Code Online (Sandbox Code Playgroud)

然后,无论您在何处定义规则:

RewriteRule ^.*$ index.php/${escape:$0} [L]
Run Code Online (Sandbox Code Playgroud)

请记住,CodeIgniter不需要PATH_INFO用来获取请求信息,REQUEST_URI如果您不使用mod_rewrite任何其他转换(并且完全避免这种麻烦),那么使用它是完全可以接受的.我认为默认情况下,CodeIgniter设置为从中获取请求AUTO(假设我没有将我的框架混淆),因此只是不用路径信息重写对URL的请求就足以进行更改.