需要在Apache上允许编码的斜杠
我目前正在尝试在url中放置一个url。 例如:
http://example.com/url/http%3A%2F%2Fwww.url2.com
我知道,我必须编码的URL,我已经做了,但现在我正在从服务器而不是我的应用程序返回404
错误。 我认为我的问题在于Apache,可以通过AllowEncodedSlashes On
指令修复。
我已经试过把这个指令放在httpd.conf的底部,我不知道下一步该怎么做。 我把它放在正确的地方? 如果是这样,有没有人有任何其他解决scheme?
编辑:请参阅@ CaffeineComa的答案。
此问题与Apache Bug 35256无关。相反,它与Bug 46830相关。AllowEncodedSlashes设置不会被虚拟主机inheritance,虚拟主机将用于许多默认的Apacheconfiguration中,例如Ubuntu中的configuration。 解决方法是在<VirtualHost>
容器(Ubuntu中的/etc/apache2/sites-available/default
)中添加AllowEncodedSlashes
设置。
错误35256 : %2F
将在PATH_INFO中进行解码( AllowEncodedSlashes
文档说不会进行解码)
错误46830 :如果在全局上下文中设置了AllowEncodedSlashes On
,则不会由虚拟主机inheritance。 您必须在每个<VirtalHost>
容器中显式设置AllowEncodedSlashes On
。
不同configuration部分如何合并的文档说:
在
<VirtualHost>
部分内的部分应用在虚拟主机定义之外的相应部分之后。 这允许虚拟主机覆盖主服务器configuration。
我不断遇到这个post的另一个问题。 让我简单地解释一下。
我有相同的样式url,也试图代理它。
示例:来自/example/
的另一台服务器的代理请求。
/example/http:%2F%2Fwww.someurl.com/
问题1: Apache认为这是一个无效的url
解决scheme:在httpd.conf中AllowEncodedSlashes On
问题2: Apache解码编码的斜杠
解决scheme:在httpd.conf中AllowEncodedSlashes NoDecode
(需要Apache 2.3.12+)
问题3: mod_proxy尝试重新编码(双重编码)将%2F
更改为%252F
的URL(例如/example/http:%252F%252Fwww.someurl.com/
)
解决scheme:在httpd.conf
使用ProxyPass
关键字nocanon
通过代理传递原始URL。
ProxyPass http://anotherserver:8080/example/ nocanon
httpd.conf文件:
AllowEncodedSlashes NoDecode <Location /example/> ProxyPass http://anotherserver:8080/example/ nocanon </Location>
参考:
我也在这个问题上浪费了很多时间。 我晚了一点,但现在看来有一个解决scheme。
根据这个线程 ,在Apache中存在一个错误,如果你有AllowEncodedSlashes On
,它会阻止404,但是它错误地解码了根据RFC的不正确的斜杠。
这个评论提供了一个解决scheme,即使用:
AllowEncodedSlashes NoDecode
鉴于所有的麻烦,我select了base64_encoding,然后是urlencoding。 它工作,而不必与阿帕奇服务器设置愚弄或查看错误报告。 它也工作,而不必把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
经过一段时间的testing,看看Apache的错误,我断定尽pipe在不同的论坛中提供了解决scheme,但这在Apache中是一个未解决的问题。 查看错误: https : //issues.apache.org/bugzilla/show_bug.cgi?id=35256
解决方法适用于我的是重构URI,以便可以包含转义斜杠的项目在URI的查询部分,而不是path。 我的testing表明,当他们在那里时,不会被AllowEncodedSlashes和AcceptPathInfo设置过滤掉。
所以: http://test.com/url?http%3A%2F%2Fwww.url2.com
: 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?theURL=http%3A%2F%2Fwww.url2.com
而不是: http://test.com/url/http%3A%2F%2Fwww.url2.com
: http://test.com/url/http%3A%2F%2Fwww.url2.com
这意味着我们项目的架构变化,但似乎不可避免。 希望你find了解决办法。
我遇到了与“AllowEncodedSlashes On”相同的问题,并尝试将该指令放置在几个不同的位置:apache2.conf,httpd.conf,并在一个部分内,如http://www.jampmark .com / web-scripting / 5-solutions-to-url-encoded-slashes-problem-in-apache.html 。
如果你还没有,你可能想设置你的日志级别debugging(另一个指令),看看你是否得到错误:
在URI中find%2f(编码的'/')(decode ='/ url / http://www.url2.com'),返回404
其他未find的错误不会在日志中提供此信息。 只是另一个诊断…
祝你好运(对我们俩)!
在客户端用%252F
replace%2F
。
这是正斜杠的双重编码forms。
所以当它到达服务器并被过早解码时,它会将其解码到%2F,这正是你想要的。