NGINX:HTTP 到 HTTPS 重定向不起作用

NGINX:HTTP 到 HTTPS 重定向不起作用

第一次在这里发帖。我在这里搜索了大约两天,想找到解决问题的方法,但毫无进展。

我知道,关于这个问题的帖子有很多,但到目前为止,我遇到的所有线程解决方案都没有奏效。我在 Amazon EC2 实例上使用 NodeJS 和 Angular 5。

导航至https://example.com运行正常。网页加载正确。但是,http://example.com给我“欢迎使用 nginx!”页面。

这是我的 nginx 服务器配置块:

server {
    listen 443 ssl default_server;
    server_name example.com

    server_tokens off;
    charset utf-8;
}

... SSL config stuff ...

    location / {
      proxy_pass http://localhost:8000/;

      proxy_http_version 1.1;

      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  $scheme;
      proxy_set_header Proxy "";
    }
}
server {
      listen 80;
      server_name example.com

      return 301 https://$host$request_uri;
}
  • 尝试将 default_server 更改为端口 80 块
  • 尝试在重定向行上使用 $server_name 而不是 $host
  • 尝试将 80 端口阻止置于 443 端口阻止之上
  • 检查配置文件中的语法错误(一切正常)

还检查了是否存在任何冲突的文件(我没有看到与 nginx.conf 相关的文件)。

curl -I http://example.com
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 18 Jul 2018 04:18:49 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 31 Jan 2017 15:01:11 GMT
Connection: keep-alive
ETag: "5890a6b7-264"
Accept-Ranges: bytes

正如你所看到的,当我卷曲时http://example.com(实际上不是 example.com),它返回状态 200 而不是 301。此外,Firefox 开发人员工具中的“网络”选项卡显示状态为 304。

答案1

请使用$server而不是$host

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

请参阅以下文档。可能会有帮助 https://www.digitalocean.com/community/questions/best-way-to-configure-nginx-ssl-force-http-to-redirect-to-https-force-www-to-non-www-on-serverpilot-free-plan-by-using-nginx-configuration-file-only

答案2

尽管这个问题已经被接受了,但我还是回答了,因为我认为这个答案是错误的。

我将您的配置粘贴在下面原样,只有一条注释指向错误放置的(似乎是多余的)关闭服务器块的花括号:

server {
    listen 443 ssl default_server;
    server_name example.com

    server_tokens off;
    charset utf-8;
}                                 <--------- CLOSED BLOCK WITH EXTRA BRACKET

... SSL config stuff ...

    location / {
      proxy_pass http://localhost:8000/;

      proxy_http_version 1.1;

      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  $scheme;
      proxy_set_header Proxy "";
    }
}
server {
      listen 80;
      server_name example.com

      return 301 https://$host$request_uri;
}

建议的方法是使用$host您最初使用的变量。$server_name变量将被虚拟主机定义替换,而不是用户输入的 URL。如果您使用 server_alias,这可能会给您带来问题。您可以在官方 nginx 文档。以下是引文:

$server_name
    name of the server which accepted a request 

$host
    in this order of precedence: host name from the request line, or host name from the “Host” request header field, or the server name matching a request 

所以。我认为你的问题出在花括号上,而不是变量上。你应该返回 $host 并重试,看看是否可行。

ps. 还要删除该proxy_http_version行和proxy_set_header空的“”,除非您有非常特殊的用例,否则不需要它们。

相关内容