第一次在这里发帖。我在这里搜索了大约两天,想找到解决问题的方法,但毫无进展。
我知道,关于这个问题的帖子有很多,但到目前为止,我遇到的所有线程解决方案都没有奏效。我在 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;
}
答案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
空的“”,除非您有非常特殊的用例,否则不需要它们。