移动端浏览器下载vcf文件时自动追加.html后缀的问题求助
问题原因
- 移动端浏览器对响应头的解析规则和PC端Chrome存在差异,部分移动端浏览器无法正确识别
text/x-vcard类型的响应,会默认将.html后缀追加到设定的下载文件名后。 - 现有
Content-Disposition的filename参数未做编码适配,部分旧版本移动端浏览器对未编码的文件名解析逻辑存在缺陷,会追加默认后缀。 - 部分移动端浏览器会优先取当前请求路径的后缀作为下载文件后缀,如果接口路径后缀为
.php或.html,也会触发文件名后缀追加的问题。
修复方案
调整响应头配置即可解决绝大多数场景的问题:
// 替换为兼容性更好的标准vCard MIME类型 header("Content-Type: text/vcard; charset=utf-8"); // filename加英文双引号包裹,同时新增filename*参数适配RFC 2231编码,兼容不同端的浏览器 header("Content-Disposition: attachment; filename=\"card.vcf\"; filename*=UTF-8''card.vcf"); header("Pragma: no-cache"); header("Expires: 0"); // 可选增加Content-Length头明确告知浏览器响应体大小,降低解析异常概率 header("Content-Length: ".strlen($vcard_serialized)); echo $vcard_serialized; exit;
如果调整后仍存在问题,可以通过伪静态规则把接口路径伪装成带.vcf后缀的形式,比如将/download/card.vcf指向对应的处理脚本,即可彻底避免移动端浏览器追加后缀的问题。
内容的提问来源于stack exchange,提问作者Alberto
相关产品推荐
相关产品推荐

