假设按以下方式发出http get请求:
var url = "https://ss1.bdstatic.com/k4oTfnSm1A5BphGlnYG/newmusic/happy.png";
var img = new Image();
img.src = url + '?hello=world|a=1|href=#feedback';
在chrome(47.0)中,请求网址为https://ss1.bdstatic.com/k4oTfnSm1A5BphGlnYG/newmusic/happy.png?hello=world|a=1|href=,
丢失了#feedback
在Firefox(42)中,请求网址为https://ss1.bdstatic.com/k4oTfnSm1A5BphGlnYG/newmusic/happy.png?hello=world|a=1|href=#feedback。
为什么chrome会截断网址?
答案 0 :(得分:2)
您的网址是有效的网址,但并不代表您的想法。
如果正确解析了您的网址,请执行以下操作:
scheme = https
authority = ss1.bdstatic.com
path = k4oTfnSm1A5BphGlnYG/newmusic/happy.png
Query = hello=world|a=1|href=
fragment = feedback
如果您希望查询为hello=world|a=1|href=#feedback
,则必须对#
进行编码,否则将被理解为查询和片段开始的结束。
对您进行编码,您的网址将如下所示:
https://ss1.bdstatic.com/k4oTfnSm1A5BphGlnYG/newmusic/happy.png?hello=world|a=1|href=%23feedback
如果您想在Javascript中对其进行编码,请使用encodeURIComponent
。
var url = "https://ss1.bdstatic.com/k4oTfnSm1A5BphGlnYG/newmusic/happy.png";
var img = new Image();
img.src = url + '?hello=world|a=1|href=' + encodeURIComponent('#feedback');
之所以出现差异,可能是因为RFC 2616并未说明网址在HTTP请求中可能有fragment
,因此Chrome认为他们不能拥有,而Firefox则将其作为查询部分的一部分。