Apache:网址中的 %25(400 错误请求)
Posted
技术标签:
【中文标题】Apache:网址中的 %25(400 错误请求)【英文标题】:Apache: %25 in url (400 Bad Request) 【发布时间】:2011-04-02 18:15:18 【问题描述】:我有一个包含以下内容的网址:
/somepath/morestuff/ohno%25foobar
由于某种原因,apache 报告了 400 错误请求(它与 %25 有关)。我正在使用 mod_rewrite 重写指向我的 codeigniter 实例的路径,但它甚至没有到达 codeigniter,这只是默认的 apache 错误。
有什么想法吗?
【问题讨论】:
你有什么理由需要%25
吗? %25
是 %
符号的代码。
@Bemrose,它实际上是用于人们可以发布任何字符串的 api。
【参考方案1】:
我怀疑您正在使用 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
来获取请求信息,如果您不使用 mod_rewrite
进行任何其他转换(并且会避免完全头痛)。我认为默认情况下 CodeIgniter 设置为从AUTO
获取请求(假设我没有混淆我的框架),所以只需不将请求重写为带有路径信息的 URL 就足以进行更改。
【讨论】:
我正在运行 apache 2.2,但 B 标志不起作用......它导致了 500。 @Ken Struys - 你的错误日志对 500 有什么看法? 表示 B 标志未知。我正在运行 2.2.3 和 2.2.7 添加了 B 标志。我确实可以完全访问服务器(不是共享主机),所以我可以对 apache 做任何我需要做的事情。 @Ken Struys - 查看 2.2 的更改日志,显然有人在某个时候破坏了B
标志,直到 2.2.12 才修复。您可以使用 latest source 重新编译 mod_rewrite
或更新 Apache,但这两者都可能比它们的价值更麻烦,所以我已经扩展了如何定义 RewriteMap
如果您想尝试使用首先。
我使用转义让它工作。最初它不起作用,因为默认情况下 codeigniter auto 不使用 REQUEST_URI 它会进行一些奇怪的自动检测。何时将其切换到配置中的 REQUEST_URI 一切正常。感谢您的帮助。【参考方案2】:
Apache 2.2.12+,只需使用B
标志。否则,请参见此处:
http://www.dracos.co.uk/code/apache-rewrite-problem/
【讨论】:
【参考方案3】:在设置为 url 之前在 jquery 中你必须像这样编码 这将编码 % 和 / 两者..... "encodeURI(encodeURI(encodeURIComponent('你的字符串')));"
在 php 或查看页面上你必须像下面这样解码
urldecode(urldecode(htmlspecialchars('你的编码字符串', ENT_QUOTES)))
【讨论】:
以上是关于Apache:网址中的 %25(400 错误请求)的主要内容,如果未能解决你的问题,请参考以下文章
Django Apache SSL [代码 400,消息错误请求]
[具有NGINX的Apache服务器的400错误请求负载平衡器