77

我目前正在尝试在 URL 中放置一个 URL。例如:

http://example.com/url/http%3A%2F%2Fwww.url2.com

我知道我必须对 URL 进行编码,我已经完成了,但现在我404从服务器而不是我的应用程序返回一个错误。我认为我的问题出在 apache 上,可以通过AllowEncodedSlashes On指令修复。

我尝试将指令放在 httpd.conf 的底部无效,并且不确定下一步该做什么。我把它放在正确的地方了吗?如果是这样,有人有其他解决方案吗?

4

7 回答 7

107

我一直在看到这篇文章来解决另一个问题。让我快速解释一下。

我有相同样式的 URL,并且也在尝试代理它。

示例:来自/example/另一台服务器的代理请求。

/example/http:%2F%2Fwww.someurl.com/

问题 1: Apache 认为这是一个无效的 url

解决方法:AllowEncodedSlashes On在httpd.conf

问题 2: Apache 解码编码的斜线

解决方案:AllowEncodedSlashes NoDecode在 httpd.conf 中(需要 Apache 2.3.12+)

问题 3: mod_proxy 尝试重新编码(双重编码)更改%2F%252F(例如/example/http:%252F%252Fwww.someurl.com/)的 URL

解决方案:httpd.conf使用ProxyPass关键字nocanon通过代理传递原始 URL。

ProxyPass http://anotherserver:8080/example/ nocanon

httpd.conf 文件:

AllowEncodedSlashes NoDecode

<Location /example/>
  ProxyPass http://anotherserver:8080/example/ nocanon
</Location>

参考:

于 2012-03-29T21:34:34.280 回答
65

此问题与 Apache 错误 35256 无关。而是与错误 46830 有关。该AllowEncodedSlashes设置不被虚拟主机继承,并且虚拟主机用于许多默认的 Apache 配置,例如 Ubuntu 中的配置。解决方法是在容器中添加AllowEncodedSlashes设置(在 Ubuntu 中)。<VirtualHost>/etc/apache2/sites-available/default

错误 35256%2F将在 PATH_INFO 中解码(文档中AllowEncodedSlashes说不会进行解码)

错误 46830:如果AllowEncodedSlashes On在全局上下文中设置,它不会被虚拟主机继承。您必须AllowEncodedSlashes On在每个<VirtalHost>容器中显式设置。

关于如何合并不同配置部分的文档说:

节内<VirtualHost>的节在虚拟主机定义之外的相应节之后应用。这允许虚拟主机覆盖主服务器配置。

于 2010-12-14T19:08:08.950 回答
33

我也在这个问题上浪费了很多时间。我参加聚会有点晚了,但现在似乎有了解决办法。

根据此线程,Apache 中存在(曾经)一个错误,如果您有AllowEncodedSlashes On,它会阻止 404,但它会错误地解码斜杠,根据 RFC,这是不正确的。

此评论提供了一个解决方案,即使用:

AllowEncodedSlashes NoDecode
于 2011-06-17T15:05:09.660 回答
4

考虑到所有的麻烦,我选择了 base64_encoding 和 urlencoding。它可以工作而无需胡乱处理 apache 服务器设置或查看错误报告。它也可以工作,而无需将 url 放在查询部分。

$enc_url = urlencode(base64_encode($uri_string));

并把它拿回来

$url = base64_decode(urldecode($enc_url));

http://example.com/admin/supplier_show/8/YWRtaW4vc3VwcGxpZXJz

http://example.com/admin/supplier_show/93/YWRtaW4vc3VwcGxpZXJzLzEwMA%3D%3D

于 2012-02-16T09:08:34.607 回答
4

在客户端替换%2F为。%252F

这是正斜杠的双重编码形式。

因此,当它到达服务器并过早解码时,它会将其解码为 %2F,这正是您想要的。

于 2015-12-08T09:34:53.840 回答
3

经过大量测试并查看 Apache 中的错误后,我得出结论,尽管在不同的论坛中提供了解决方案,但这在 Apache 中是一个未解决的问题。查看错误:https ://issues.apache.org/bugzilla/show_bug.cgi?id=35256

对我有用的解决方法是重构 URI,以便可以包含转义斜杠的项目位于 URI 的查询部分,而不是路径。我的测试表明,当它们存在时,无论 AllowEncodedSlashes 和 AcceptPathInfo 设置如何,它们都不会被 Apache 过滤掉。

所以: http://test.com/url?http%3A%2F%2Fwww.url2.com

或者: http://test.com/url?theURL=http%3A%2F%2Fwww.url2.com

代替: http://test.com/url/http%3A%2F%2Fwww.url2.com

这意味着我们项目的架构发生了变化,但这似乎是不可避免的。希望您找到解决方案。

于 2010-12-10T22:02:08.840 回答
0

我在使用“AllowEncodedSlashes On”时遇到了同样的问题,并尝试将指令放在几个不同的地方:apache2.conf、httpd.conf 和一个部分内,根据 http://www.jampmark上的示例.com/web-scripting/5-solutions-to-url-encoded-slashes-problem-in-apache.html

如果您还没有,您可能希望将日志记录级别设置为调试(另一个指令)并查看是否收到错误:

在 URI (decoded='/url/http://www.url2.com') 中找到 %2f (encoded '/'),​​返回 404

其他未找到的错误不在日志中提供此信息。只是另一个诊断...

祝你好运(对我们俩)!

于 2010-12-09T22:46:31.717 回答