需要在Apache上允许编码斜杠

tom*_*zle 68 apache apache2 apache-config

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

http://example.com/url/http%3A%2F%2Fwww.url2.com
Run Code Online (Sandbox Code Playgroud)

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

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

tec*_*rat 80

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

我有相同的样式URL,也试图代理它.

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

/example/http:%2F%2Fwww.someurl.com/
Run Code Online (Sandbox Code Playgroud)

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

解决方案: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
Run Code Online (Sandbox Code Playgroud)

httpd.conf文件:

AllowEncodedSlashes NoDecode

<Location /example/>
  ProxyPass http://anotherserver:8080/example/ nocanon
</Location>
Run Code Online (Sandbox Code Playgroud)

参考:

  • 哇.完美的答案,有效,简洁.请将此作为接受的答案. (5认同)
  • 前两个问题在网络上得到了很好的记录,但在我看到这个答案之前,问题 3 是一个难以破解的难题。*谢谢你*。 (2认同)

Rog*_*ahl 57

此问题与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>部分应用于虚拟主机定义之外的相应部分之后.这允许虚拟主机覆盖主服务器配置.


Geo*_*old 32

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

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

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

AllowEncodedSlashes NoDecode
Run Code Online (Sandbox Code Playgroud)


Kin*_*xit 5

鉴于所有的麻烦,我选择了base64_encoding,然后是urlencoding.它的工作原理无需使用apache服务器设置或查看错误报告.它也可以在不必将url放在查询部分中.

$enc_url = urlencode(base64_encode($uri_string));
Run Code Online (Sandbox Code Playgroud)

并把它拿回来

$url = base64_decode(urldecode($enc_url));
Run Code Online (Sandbox Code Playgroud)

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

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