【发布时间】:2017-06-14 01:46:41
【问题描述】:
我正在使用 Symfony 框架在 ovh 服务器上创建一个网站。
当用户更改页面时,我会创建一个新的XMLHttpRequest,以避免重新加载所有页面并改善用户体验。
一切正常,但我想在下一页异步加载时添加一个加载栏。不幸的是,lengthComputable 参数是错误的。
为了解决这个问题,我在 Symfony3 上设置了标题,然后用这些行发送响应:
$length = strlen($event->getResponse()->getContent());
$event->getResponse()->headers->set('Content-Length', $length);
$event->getResponse()->headers->set('Accept-Ranges', "bytes");
$event->getResponse()->sendHeaders();
这个技巧适用于我的本地开发服务器,lengthComputable 设置为 true,我可以计算当前的负载百分比。但是当我把所有东西都放在我的远程开发服务器上时,lengthComputable 又是假的。
这是使用这四行的响应标头:
Accept-Ranges:bytes
Accept-Ranges:bytes
Cache-Control:no-cache
Cache-Control:no-cache
Content-Encoding:gzip
Content-Length:3100
Content-Length:3100
Content-Type:text/html; charset=UTF-8
Date:Sat, 28 Jan 2017 12:34:08 GMT
Server:Apache
Set-Cookie:PHPSESSID=***; path=/; HttpOnly
Vary:Accept-Encoding
(是的,有些参数出现了两次)
我认为这与跨域标头策略有关,但我找不到解决方案。
我尝试设置其他参数,例如
$responseHeaders->set('Access-Control-Allow-Headers', 'content-type');
甚至
$responseHeaders->set('Access-Control-Allow-Origin', '*');
我关注并尝试了这些链接
Symfony2. I can't set Content-Length header
How can I access the Content-Length header from a cross domain Ajax request?
编辑
我没有使用任何代理,我的服务器托管在 OVH 上。
这是我的 javascript 代码(没什么特别的)
ajax_oReq = new XMLHttpRequest();
ajax_oReq.addEventListener("progress", progress, false);
ajax_oReq.addEventListener("load", complete, false);
ajax_oReq.addEventListener("error", error, false);
ajax_oReq.addEventListener("abort", error, false);
params = "ajax=1";
if(url.indexOf('?')!=-1){ params = "&"+params; }else{ params = "?"+params; }
ajax_oReq.open("GET", url+params, true);
ajax_oReq.send();
在我的progress(evt) 函数中,我可以通过记录evt 参数看到lengthComputable 为假。
在我的complete(evt) 函数中,我将evt.target.response 放入对应的div。
我只想补充一点,当我使用此代码时,我会在大约 500 毫秒后收到最后一个进度事件,加载的长度等于页面的总长度(所以是文档的 100%,但 lengthComputable 是假的total 等于 0,所以我知道它只是因为我在加载结束时查看我的标题)
但是调用complete 函数需要大约5 秒。我认为这是因为内容长度未知。无论如何,当我删除我的 4 行代码(第一行)时,这个问题就消失了,但我总是没有 lengthComputable=true ...
感谢您的宝贵时间!
【问题讨论】:
-
发布您的 javascript。您是否使用相同的浏览器进行测试?您的开发服务器是否在代理后面?
-
我编辑了我的帖子,所以我尝试了 chrome、firefox、opera 和 safari,结果相同。不,我没有使用代理,我的服务器由 OVH 托管(专业版)
-
您是否使用与本地相同的内容编码? GZIP 可能是这里的问题
-
其实我不太明白:我的页面是html页面,所以在本地和远程服务器一样,我使用纯文本编码。
-
Content-Encoding:gzip表示 Apache 正在使用 gzip 压缩响应,因此您在 PHP 中设置的长度可能不正确。检查 localhost 中的标头以查看Content-Encoding是否为相同的值。
标签: php http-headers xmlhttprequest cors symfony