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,消息错误请求]

在 solr 上收到错误请求 (400)

[具有NGINX的Apache服务器的400错误请求负载平衡器

npm 和 package.json _ npm ERR 中的所有者存储库有问题! 400 错误请求(npm 发布)

apache - 域 Debian 8 中的错误 400

使用 Apache/NginX 部署时出现 Django Bad Request(400) 错误