Почему Chrome отменяет 302 загрузки?

Редактирование. После решения некоторых проблем, которые могут возникнуть или не возникли проблемы, дальнейшее тестирование показало, что затронутые пользователи не могут загружать файлы, даже напрямую. Это вызвало этот вопрос на веб-мастерах Stackexchange . Я принимаю ответ, который, вероятно, устранил проблему, все ли было связано с перенаправлением.


У меня есть сценарий, который обрабатывает загрузки для моего сайта на основе подписки. В основном сценарий проверяет сеанс и / или IP на базе базы данных для идентификации пользователя, а затем проверяет запрашиваемый видеофайл на базу данных, чтобы убедиться, что у пользователя должен быть доступ. Основываясь на результатах этих проверок, скрипт использует header('location: [blah]'); либо отправить пользователя в файл, либо отправить его на страницу с ошибкой.

Все работает отлично в IE, Firefox и некоторых случаях Chrome. В других случаях Chrome пользователи видят, что загрузка полностью завершена. Я обнаружил, что для этих пользователей Chrome автоматически отменяет перенаправление 302, сделанное header(); вызов, предотвращающий загрузку файла.

Почему это происходит? Что я могу сделать с этим?


Редактирование: вот исходные заголовки, как видно из 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 

Скорее удивительно, проблема заключается в том, что вы отправляете заголовок «location» вместо стандартного заголовка «Местоположение». Я сделал быстрый тест, который, казалось, подтвердил это, но я все еще не мог в это поверить, поэтому я сделал быстрый поиск в Интернете и обнаружил, что кто-то еще подтверждает, что Chrome действительно такой приверженец, что он не будет принимать HTTP-заголовок с неправильный случай. В комментарии к руководству PHP упоминается IE7 с тем же причудой.

Как упоминалось в комментариях php.net и моем ответе на stackoverflow:

Chrome не выполняет команду Location: если он не получает статус: сначала. Он также чувствителен к капитализации.