需要在Apache上允许编码斜杠


73

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

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

我知道我必须完成对URL的编码,但是现在我404从服务器而不是我的应用程序中得到了一个错误。我认为我的问题出在apache上,可以通过AllowEncodedSlashes On指令解决。

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


除了stackoverflow.com/a/9933890/6333217:如果您使用RewriteRule而不是,ProxyPass则应添加NE标志以避免解码。
Woland

Answers:


62

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

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

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

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

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


93

我不断遇到这个帖子的另一个问题。让我简单快速地解释一下。

我有相同的样式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的尝试重新编码(双编码)URL变化%2F%252F(例如/example/http:%252F%252Fwww.someurl.com/

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

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

httpd.conf文件:

AllowEncodedSlashes NoDecode

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

参考:


2
前两个问题在网络上都有很好的记录,但是在我看到这个答案之前,第3个问题很难破解。谢谢你
Daniel Beardsley 2014年

1
这个解决方案就像一个魅力!这应该是答案!谢谢!
Jose De Gouveia 2014年

6
哇。完美的答案,有效,简洁。请将此作为可接受的答案。
Thomas Vander Stichele 2014年

1
我花了很长时间才找到这个答案。有时候,仅仅投票是远远不够的。非常感谢!
cmroanirgo

非常感谢。所需的确切内容。
Ameo '17

33

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

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

此注释提供了一种解决方案,即使用:

AllowEncodedSlashes NoDecode

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


我不喜欢它,但最终会这样太
克里斯-

1
您会在这里遇到相同的问题,因为'/'是base64字符。
TerjeBråten15年

1
/无论采用哪种方法进行urlencode编码,它仍然%2F是吗?
威廉·伊斯特

php.net网站上针对base64_encode()的最高注释为URL安全版本提供了一个很好的解决方案:php.net/manual/en/function.base64-encode.php#103849 基本上,它涉及用替代方式替换+和/编码/解码上的字符。
leeb's

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

这意味着我们项目的体系结构更改,但这似乎是不可避免的。希望您找到了解决方案。


嗨,罗布。是的,我得到了相同的结果,因此也必须实施架构更改。有点令人失望,但很高兴它在此阶段有效。谢谢。
tommizzle,2010年

3

更换%2F%252F在客户端。

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

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


2
您永远都不应双重编码:tools.ietf.org/html/rfc3986#section-2.4
koppor

@koppor但是,如果您知道它已被双重编码,则可以对其进行双重解码。因此,您可以对整个组件进行双重编码,然后在另一侧对该组件进行第二次解码?
Neal Gokli '17

0

我在“ AllowEncodedSlashes On”上遇到了相同的问题,并尝试将指令放置在几个不同的位置:apache2.conf,httpd.conf和节内,如http://www.jampmark上的示例 .com / web-scripting / 5-solutions-to-url-encoded-slashes-problem-in-apache.html

如果尚未安装,则可能需要将日志记录级别设置为调试(另一个指令),然后查看是否收到错误:

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

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

祝你好运(我们俩)!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.