Angular部署AWS时apple-app-site-association文件MIME类型重置问题
解决Angular部署后Apple App Site Association文件MIME类型重置问题
方案1:强制设置无扩展名文件的MIME类型(推荐)
问题核心是每次部署时S3会默认根据文件扩展名推断MIME类型,无扩展名文件会被设为binary/octet-stream,所以需要在部署流程中主动指定该文件的Content-Type。
方式A:AWS CLI部署脚本指定
用AWS CLI同步文件时分两步执行,先单独处理目标文件:
- 同步
.well-known/apple-app-site-association并指定MIME类型:
aws s3 sync dist/your-app-name/.well-known s3://your-bucket/.well-known \ --exclude "*" \ --include "apple-app-site-association" \ --content-type "application/json"
- 同步其他静态文件(避免覆盖已设置的MIME属性):
aws s3 sync dist/your-app-name s3://your-bucket \ --exclude ".well-known/apple-app-site-association"
方式B:AWS CDK/CloudFormation定义属性
用基础设施即代码工具部署时,直接在S3对象定义中指定ContentType:
// AWS CDK示例代码 new s3.BucketDeployment(this, 'DeployApp', { sources: [Source.asset('dist/your-app-name')], destinationBucket: yourBucket, contentType: { value: 'application/json', files: '.well-known/apple-app-site-association' } });
方式C:Lambda@Edge动态修改响应头
如果无法修改部署脚本,可在CloudFront中添加Lambda@Edge函数,在响应阶段调整Content-Type:
exports.handler = (event, context, callback) => { const response = event.Records[0].cf.response; const request = event.Records[0].cf.request; if (request.uri === '/.well-known/apple-app-site-association') { response.headers['content-type'] = [{ key: 'Content-Type', value: 'application/json' }]; } callback(null, response); };
将该函数关联到CloudFront的「Origin Response」或「Viewer Response」事件即可生效。
方案2:保留.json扩展名并实现路径映射
若想保留apple-app-site-association.json文件,可通过AWS配置实现无扩展名路径的访问:
方式A:S3静态网站重定向规则
在S3桶的「静态网站托管」设置中添加以下规则:
[ { "Condition": { "KeyPrefixEquals": ".well-known/apple-app-site-association" }, "Redirect": { "HostName": "example.com", "ReplaceKeyPrefixWith": ".well-known/apple-app-site-association.json", "HttpRedirectCode": "200" } } ]
注意:此方式需开启S3静态网站托管,且CloudFront源需指向S3网站端点而非REST端点。
方式B:CloudFront路径转发配置
在CloudFront分发中新增一个行为:
- 路径模式:
/.well-known/apple-app-site-association - 源:选择你的S3桶
- 转发路径:设置为
/.well-known/apple-app-site-association.json - 缓存策略:根据业务需求选择合适的规则
这样用户访问无扩展名路径时,CloudFront会自动转发到带.json的文件,S3会根据扩展名自动返回application/json类型的响应。
内容的提问来源于stack exchange,提问作者Jordin Vell
相关产品推荐
相关产品推荐

