首页 > 解决方案 > 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 的其他服务器定义捕获。知道为什么这现在有效吗?

标签: nginxhttps

解决方案


我弄清楚了 http 服务器定义中的 location 块起作用的原因。在 AWS 中,我不小心让负载均衡器将所有请求转发到 EC2 实例上的端口 80。因此,即使我的 http 服务器定义重定向到站点的 https 版本,这些 https 请求仍然最终由相同的 http 服务器定义处理,并且由于它之前根本没有位置块,这就是导致它的原因失败。最后,我从 http 服务器定义中删除了 location 块,然后正确更新了我的负载均衡器以将 https 请求转发到 EC2 实例上的端口 443,现在一切正常。


推荐阅读