为什么Chrome取消302下载?

时间:2011-11-04 16:08:35

标签: php google-chrome redirect header

编辑:在解决可能导致或未导致问题的一些问题后,进一步测试显示受影响的用户甚至无法直接下载文件。这促使this question on Webmasters Stackexchange。我接受了似乎已经解决了问题的答案,是关于重定向的。


我有一个script来处理基于订阅的视频网站的下载。基本上,脚本针对数据库检查会话和/或IP以识别用户,然后针对数据库检查所请求的视频文件以验证用户应该具有访问权。根据这些检查的结果,脚本使用header('location: [blah]');将用户发送到文件或将其发送到错误页面。

在IE,Firefox和某些Chrome实例中,一切正常。在Chrome的其他情况下,用户会看到下载完全失败。我发现,对于这些用户,Chrome会自动取消header();调用所做的302重定向,从而阻止文件下载。

为什么会这样?我该怎么办呢?


编辑:以下是原始标题,如Fiddler在下载失败的计算机上看到的。

请求:

GET /download_video.php?t=Nodeg004&format=wmv HTTP/1.1
Host: www.mysite.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://www.mysite.com/phpBB3/viewtopic.php?f=3&t=6847
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: phpbb3_cmviy_u=698; phpbb3_cmviy_k=; phpbb3_cmviy_sid=0c2fd249ff50c922beb1c7f88437c283; style_cookie=printonly; __utma=174624884.1269868282.1272079241.1320418809.1320423695.199; __utmb=174624884.5.10.1320423695; __utmc=174624884; __utmz=174624884.1319811247.179.134.utmcsr=facebook.com|utmccn=(referral)|utmcmd=referral|utmcct=/l.php

响应:

HTTP/1.1 302 Moved Temporarily
Date: Fri, 04 Nov 2011 16:22:05 GMT
Server: Apache
location: http://www.mysite.com/videos/zh4ZcnzIWJpni8tG5CzG/Nodeg004.wmv
Content-Length: 0
Connection: close
Content-Type: text/html

请求:

GET /videos/zh4ZcnzIWJpni8tG5CzG/Nodeg004.wmv HTTP/1.1
Host: www.mysite.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://www.mysite.com/phpBB3/viewtopic.php?f=3&t=6847
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: phpbb3_cmviy_u=698; phpbb3_cmviy_k=; phpbb3_cmviy_sid=0c2fd249ff50c922beb1c7f88437c283; style_cookie=printonly; __utma=174624884.1269868282.1272079241.1320418809.1320423695.199; __utmb=174624884.5.10.1320423695; __utmc=174624884; __utmz=174624884.1319811247.179.134.utmcsr=facebook.com|utmccn=(referral)|utmcmd=referral|utmcct=/l.php

响应:

HTTP/1.1 200 OK
Date: Fri, 04 Nov 2011 16:22:05 GMT
Server: Apache
Last-Modified: Wed, 28 Sep 2011 13:28:50 GMT
ETag: "180cc25a-5700e91-4ae005f5ce880"
Accept-Ranges: bytes
Content-Length: 91229841
Keep-Alive: timeout=10, max=30
Connection: Keep-Alive
Content-Type: application/octet-stream

2 个答案:

答案 0 :(得分:4)

相当令人惊讶的是,问题似乎是您发送了“位置”标头而不是标准的“位置”标头。 我做了一个快速测试似乎证实了这一点,但我仍然无法相信,所以我做了一个快速的网络搜索,发现someone else确认Chrome确实是一个如此坚持,它不会接受HTTP标题错误的情况。 PHP手册中的comment提到IE7具有相同的怪癖。

答案 1 :(得分:1)

正如堆栈溢出中php.net commentsmy response中所述:

  

Chrome不会执行位置:指令,除非它获得状态:首先。它对资本化也很敏感。