![仅在 Web 根目录上出现 AWS CloudFront 404 错误-带有 express 和 pug 的 node.js](https://linux22.com/image/787327/%E4%BB%85%E5%9C%A8%20Web%20%E6%A0%B9%E7%9B%AE%E5%BD%95%E4%B8%8A%E5%87%BA%E7%8E%B0%20AWS%20CloudFront%20404%20%E9%94%99%E8%AF%AF-%E5%B8%A6%E6%9C%89%20express%20%E5%92%8C%20pug%20%E7%9A%84%20node.js.png)
设置
我有一个基于 node.js、express.js 和 pug.js 构建的网站,运行在 AWS 中的 AMI Linux 实例上。我为该实例提供了一个弹性 IP,如果我直接浏览该弹性 IP 生成的 DNS 记录,则一切都正常运行。
我还为该站点创建了一个 CloudFront 分发版。原点设置为弹性 IP 的生成 DNS 记录,并且只有两种行为 - 一种用于 *,另一种用于仅允许 POST 动词的联系表单(默认行为不允许 POST)。该站点的公共 DNS 条目指向 CloudFront 分发版。
问题
同样,当我直接浏览 http://ec2- <elastic-IP-address>
.compute-1.amazonaws.com 时,一切正常。当我浏览 https:// <custom domain>
.com/about 或 /contact 或网站的任何其他页面时,它也能正常工作。但,当我浏览仅未指定页面的 URL(即仅 https:// <custom domain>
.com)时,我收到 Express 生成的 404 页面。
我尝试过的方法
- 我进行了大量网络搜索,甚至没有找到任何与同一问题相关的结果。
- 我尝试在 CF 分布中为 / 创建特定行为并将其发送到主页的特定目标,但结果没有变化。
- 我想知道默认的 Express 端口 3000 是否以某种方式干扰了 CF 从源站检索站点的方式,因此我做了一些工作,使节点可以在端口 80 上运行,并更改了端口和 CF 源站端口。站点仍然正常运行,但问题仍然存在。
- 我检查了路由以查找问题,但没发现任何看似问题的地方。此外,由于如果我绕过 CF,网站完全可以正常工作,因此我无法想出为什么直接浏览可以工作而 CF 不行的理论。
细节
我的app.js的路由内容是:
var indexRouter = require('./routes/index');
app.use('/', indexRouter);
./routes/index.js 里面有:
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { homeactive: 'active' });
});
/* GET home page. */
router.get('/home', function(req, res, next) {
res.render('index', { homeactive: 'active' });
});
完整的 Express 错误是:
Not Found
404
NotFoundError: Not Found
at /home/ec2-user/website/Express/app.js:28:8
at Layer.handle [as handle_request] (/home/ec2-user/website/Express/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/home/ec2-user/website/Express/node_modules/express/lib/router/index.js:328:13)
at /home/ec2-user/website/Express/node_modules/express/lib/router/index.js:286:9
at Function.process_params (/home/ec2-user/website/Express/node_modules/express/lib/router/index.js:346:12)
at next (/home/ec2-user/website/Express/node_modules/express/lib/router/index.js:280:10)
at /home/ec2-user/website/Express/node_modules/express/lib/router/index.js:646:15
at next (/home/ec2-user/website/Express/node_modules/express/lib/router/index.js:265:14)
at Function.handle (/home/ec2-user/website/Express/node_modules/express/lib/router/index.js:175:3)
at router (/home/ec2-user/website/Express/node_modules/express/lib/router/index.js:47:12)
我不确定 CF 的哪些来源或行为设置会有帮助。它几乎完全符合您的预期,没有什么特别的。
原点是“自定义”原点(输入 URL 而不是选择 S3 存储桶或 ELB 等),其中 ec2-.compute-1.amazonaws.com<elastic-IP-address>
作为 URL,仅 HTTP,端口 80,原点路径为空白,原点屏蔽关闭,无高级设置。
行为是路径模式 *、选择上面详述的来源、压缩设置为是、将 HTTP 重定向到 HTTPS、仅允许 GET、HEAD、没有查看器访问限制、CachingOptimized 管理缓存策略。
免责声明
我完全清楚,此托管的当前设置在某些方面根本不专业。这是一个个人网站,我在构建和部署此网站时正在自学 node、express、pug 和 AMI Linux。在迭代网站设计和基础设施/devops 之前,我试图获得一个“最小可行产品”。我确实计划最终进行容器化,如果我能负担得起,可能会做 WAF,等等。所以我不需要听到很多关于我在网站的安全性或可靠性方面做错的事情。我之前曾在 AWS 上为一个高度可靠、流量很大的 Web 应用程序做过 devops,所以我知道涉及的内容,也知道它的成本。当它是客户的钱时,他们会得到所有的花哨东西。
编辑:这可能是一个我会尝试的修复方法,但不能说我喜欢它。
https://exanubes.com/blog/fix-cloudfront-404-errors-when-visiting-direct-urls