需要在Apache上允许编码斜杠

时间:2010-12-08 17:32:25

标签: apache apache2 apache-config

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

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

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

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

7 个答案:

答案 0 :(得分:74)

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

我有相同的样式网址,并且还尝试代理它。

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

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

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

解决方案:httpd.conf中的AllowEncodedSlashes On

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

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

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

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

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

httpd.conf文件:

AllowEncodedSlashes NoDecode

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

参考:

答案 1 :(得分:54)

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

Bug 35256%2F将在PATH_INFO中解码(文档到AllowEncodedSlashes表示不会进行解码)

Bug 46830:如果在全局上下文中设置了AllowEncodedSlashes On,则虚拟主机不会继承它。您必须在每个AllowEncodedSlashes On容器中明确设置<VirtalHost>

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

  

<VirtualHost>部分中的部分应用于虚拟主机定义之外的相应部分之后。这允许虚拟主机覆盖主服务器配置。

答案 2 :(得分:31)

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

根据this thread,Apache中存在一个错误,如果你有AllowEncodedSlashes On,它会阻止404,但它会错误地解码斜杠,根据RFC,这是不正确的。

This comment提供了一种解决方案,即使用:

AllowEncodedSlashes NoDecode

答案 3 :(得分:5)

鉴于所有的麻烦,我选择了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

答案 4 :(得分:2)

经过一些测试,并查看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

这意味着我们项目的架构变更,但似乎不可避免。希望你找到解决方案。

答案 5 :(得分:0)

我遇到了与“AllowEncodedSlashes On”相同的问题,并尝试将指令放在几个不同的地方:apache2.conf,httpd.conf,以及一个部分内部,例如{{3} }。

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

在URI中找到%2f(编码为'/')(decoding ='/ url / http://www.url2.com'),返回404

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

祝你好运(对我们俩来说)!

答案 6 :(得分:0)

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

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

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