nginx - NGINX 错误地将请求转发到默认位置
问题描述
我有一个尝试在 AWS EC2 实例上部署的 React Web 应用程序,并且我正在使用 NGINX。我正在尝试对其进行设置,以便将所有 http 请求重定向到 https。现在它似乎将所有 http 请求重定向到 https,但 NGINX 将请求转发到默认路径 /usr/share/nginx/html/ 而不是我在 localhost 上运行的 Web 应用程序。我已经阅读了数十篇文章,并且几天来一直试图弄清楚这一点。指针将不胜感激。提前致谢。
这是我在 /etc/nginx/sites-available/default 的 NGINX 服务器配置:
server {
listen 80;
if ($http_x_forwarded_proto = "http") {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2 default_server;
listen 443 ssl http2 default_server;
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1h;
location / {
proxy_pass http://127.0.0.1:3839;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
此外,该应用程序正在我的位置块中指定的端口上运行和访问。我可以在机器上使用 curl 127.0.0.1:3839 毫无问题地到达它。我可以在 /var/log/nginx/error.log 中看到 nginx 正在尝试从 /usr/share/nginx/html/ 目录中提供请求,这就是我发现问题所在。我只是不知道为什么它在那里发送请求,而不是发送到我在我的位置块中指定的本地主机上的端口。如果我转到我的应用程序的根 url,我会看到“欢迎使用 NGINX”页面。如果我转到我的根 url 下的任何子路径,例如 example.com/login,那么我得到一个 404 并且 error.log 显示它找不到资源 /usr/share/nginx/html/login 例如。谢谢 :)
更新:
在我添加的 listen 80 server 块内
location / {
proxy_pass http://127.0.0.1:3839;
}
现在它似乎工作正常,但我不知道为什么我需要在监听 80 服务器定义中定义一个位置块,如果该块中的请求只是被重定向以被侦听 443 的其他服务器定义捕获。知道为什么这现在有效吗?
解决方案
我弄清楚了 http 服务器定义中的 location 块起作用的原因。在 AWS 中,我不小心让负载均衡器将所有请求转发到 EC2 实例上的端口 80。因此,即使我的 http 服务器定义重定向到站点的 https 版本,这些 https 请求仍然最终由相同的 http 服务器定义处理,并且由于它之前根本没有位置块,这就是导致它的原因失败。最后,我从 http 服务器定义中删除了 location 块,然后正确更新了我的负载均衡器以将 https 请求转发到 EC2 实例上的端口 443,现在一切正常。
推荐阅读
- javascript - Durandal 单页应用程序中未定义“setCookies”函数
- javascript - 选择表格行内的输入
- php - 过滤掉 23 天前使用 mysql 创建的所有用户
- java - 无法解析 okhttp request.builder()
- node.js - Visual Studio Code 中的节点调试无法启动
- git - 克隆我的后如何推送到其他人的存储库?
- sql - SQL - 通过输入两个单词来选择行
- angularjs - 如何在 2 个组件 angularjs 之间共享数据(使用打字稿)
- html - 关注 IE 11 中的块
- java - NotifyBuilder 总是返回 false