无法使用云前端和原始服务器作为ec2实例来提供静态文件

时间:2019-05-12 12:38:29

标签: nginx amazon-ec2 amazon-cloudfront

我有一个Web应用程序在具有SSL认证(让我们加密)的Nginx反向代理后面的centos ec2实例上运行。

我在URL上有一个javascript文件,例如https://example.com/static/src/js/allEnd.js
我使用CloudFront将原始服务器作为HTTP ec2实例(而不使用s3存储桶)传递了静态文件。
我的原始服务器已映射为域名https://example.com,到目前为止,我已经进行了以下配置:
1.在Nginx中将www.example.com重定向到example.com
2. CloudFront URL是我的自定义域的别名,即cdn.example.com
3. example.com的SSL在Nginx上完成,而cdn,example.com的SSL在AWS上完成。

到目前为止,我了解的是CloudFront第一次通过从ec2服务器获取文件来提供静态内容,然后下次从CloudFront提供文件,但是每次CloudFront重定向到原始服务器以获取静态内容时,在我的情况下,CloudFront无法提供的静态文件。

这是原始服务器和CloudFront服务器的标头。

1. Origin server (https://example.com)
get https://example.com/static/src/js/allEnd.js
HTTP/2 200
server: nginx/1.12.2
date: Sun, 12 May 2019 12:27:50 GMT
content-type: application/javascript
content-length: 168435
etag: "wzsdm-1557567525-168435-283837276"
cache-control: max-age=604800, public
expires: Sun, 19 May 2019 12:27:50 GMT
strict-transport-security: max-age=15768000; includeSubdomains; preload
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
strict-transport-security: max-age=15768000

2. CloudFront with origin as https://example.com (https://cdn.example.com)
get https://cdn.example.com/static/src/js/allEnd.js
HTTP/2 301
content-type: text/html
content-length: 185
location: https://example.com/static/src/js/allEnd.js
server: nginx/1.12.2
date: Sun, 12 May 2019 09:17:40 GMT
strict-transport-security: max-age=15768000; includeSubdomains; preload
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
strict-transport-security: max-age=15768000
age: 17
x-cache: Hit from cloudfront
via: 1.1 76d9b50884e58e2463b175e34e790838.cloudfront.net (CloudFront)
x-amz-cf-id: HBbfJXbFgKQz4eYlQSpLPQAk8pxZRKuGsb6YjFu8-AJL0JwPfs8FZw==

您会看到cdn.example.com(CloudFront)重定向到源(example.com)的响应标头。 另外,我对应该为content-type:text/html的{​​{1}}

感到困惑

我配置错误的可能性有哪些?

如果您想了解更多信息,请随时提问。谢谢。

P.S:Nginx和AWS配置是我的新手,最重要的是缓存控制。

1 个答案:

答案 0 :(得分:0)

您需要检查原始服务器的配置和日志文件,以了解发生这种情况的原因。

检查原始服务器日志,您会发现原始服务器最初生成了301重定向响应-不是CloudFront。

请注意,CloudFront 中的响应标头包括server: nginx/1.12.2。 CloudFront没有添加它。

按原样设置Content-Type,因为您的原始服务器还返回了HTML,表明“对象已移动”或“您正在重定向”之类的内容。现代浏览器通常不显示该消息,它们仅遵循重定向。

无论如何,如果原始服务器返回重定向,CloudFront不会遵循原始服务器返回的重定向,它只是将重定向返回到浏览器。

您可能会看到的行为的一种解释是,您将CloudFront中的“原始协议策略”设置为“仅HTTP”,而不是“仅HTTPS”或“匹配查看器”,因此源尝试将连接重定向为使用HTTPS因为它将来自CloudFront的传入连接视为HTTP而不是HTTPS。

另一种可能性是,您将CloudFront的“缓存行为”设置配置为将Host标头列入白名单以转发到源。