我通过使用X-SendFile传送给用户的较大视频文件出现了奇怪的行为。服务器响应412 - Precondition Failed。
如果我禁用X-SendFile,一切正常,所以它必须与之相关。
一些代码:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file_path);
header("Content-type: ". $mime);
finfo_close($finfo);
header('Content-length: '.filesize($file_path));
header('Content-Disposition: inline; filename="'.basename($file_path).'"');
header('X-Sendfile: ' . $file_path );
标题:
Request URL:[redacted]/8c1ab69235fef2009731481d728a3c37.mp4
Request Method:GET
Status Code:412 Precondition Failed
Remote Address:192.168.100.100:80
请求:
Accept:*/*
Accept-Encoding:identity;q=1, *;q=0
Accept-Language:en-US,en;q=0.8,ro;q=0.6,de;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie:PHPSESSID=rlva81b8gl98flv3r37dd0jtu4
Host:datasolutions.eleap.loc
If-Match:"57e7e64-545404121a47c"
Range:bytes=92078080-
Referer:[redacted]/8c1ab69235fef2009731481d728a3c37.mp4
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
响应:
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:close
Content-Disposition:inline; filename="8c1ab69235fef2009731481d728a3c37.mp4"
Content-length:0
Content-Type:video/mp4
Date:Wed, 04 Jan 2017 11:08:23 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Pragma:no-cache
Server:Apache/2.4.20 (Ubuntu)
X-Sendfile:[redacted]/8c1ab69235fef2009731481d728a3c37.mp4
我无法找到任何关于这个原因的暗示,也许你们其中一个人有一个线索。谢谢。
更新:这只发生在Chrome中。
答案 0 :(得分:4)
我在加载mp4时遇到类似问题(不使用X-Send)。我发现当我将Chrome降级到之前的版本(54)时,问题就消失了。几周前发布的新版本55似乎已经引入了这个问题。
答案 1 :(得分:0)
我刚解决了#34; 412 Precondition Failed"在使用mod_xsendfile 0.12&的一组Web服务器上Apache / mod_perl设置用于传送mp3音频文件。
Apache在出站标题上设置了弱ETag。 Chrome版本> = 55使用ETag通过HTTP_IF_MATCH标头检查文件新鲜度,xsendfile正在响应412.
我的解决方法是关闭特定目录的ETag。
<Directory />
Header unset Etag
FileETag none
</Directory>
或者,您可以编辑用于计算ETag的参数(例如,删除INode参数以在服务器群集中工作)。
可在此处找到有关详细信息的简短说明: http://joshua.schachter.org/2006/11/apache-etags
Apache Docs:http://httpd.apache.org/docs/2.2/mod/core.html#fileetag
实体代码:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag