我有一个包含以下内容的网址:
/somepath/morestuff/ohno%25foobar
出于某种原因,apache 正在报告 400 错误请求(它与 %25 有关)。我正在使用 mod_rewrite 重写路径以指向我的 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]
还有一个escape
RewriteMap
在以前的 Apache 版本的 mod_rewrite
中作为内部映射可用,但不幸的是,必须在服务器或虚拟服务器配置级别启用此映射,因此如果您在共享主机。它做同样的事情,但更刻意一些。
在您的服务器/虚拟服务器配置中:
RewriteMap escape int:escape
然后,无论您在哪里定义规则:
RewriteRule ^.*$ index.php/${escape:$0} [L]
请记住,CodeIgniter 不需要使用 PATH_INFO
来获取请求信息,如果您不使用 ,使用
进行任何其他转换(并且可以完全避免这种头痛)。我认为默认情况下 CodeIgniter 设置为从 REQUEST_URI
是完全可以接受的>mod_rewriteAUTO
获取请求(假设我没有混淆我的框架),所以只要不使用路径信息重写对 URL 的请求就足够了那个改变。
关于Apache:url 中的 %25(400 错误请求),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3549747/