我正在尝试从 http 重新路由到 https。例如,您访问 example.com,系统将自动重定向到https://example.com。
我尝试使用这个:
server {
listen 80;
return 301 https://$host$request_uri;
}
还有这个:
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
如此处所示:在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https?
但对我来说,这两种方法似乎都不起作用。我继续使用 example.com。
有人有主意吗?
答案1
您尚未为您的主机定义服务器名称。
server {
listen 80;
server_name *.example.com example.com;
return 301 https://$host$request_uri;
}
否则不会调用您的主机。查看示例时,您会发现在两种情况下都定义了服务器名称。
答案2
我也遇到过类似的错误。页面没有重定向,而是一直显示 404。
结果是配置之间发生了冲突。
我的配置放在 /etc/nginx/conf.d/ 中。我没有注意到的是,在 /etc/nginx/sites-enabled/ 中有一个默认配置,它也监听端口 80,其优先级高于我在 conf.d 中的配置。只需删除默认配置即可解决我的问题,重定向可以正常工作。
答案3
您的第二个示例适用于任何请求http://example.com但是请记住 www.example.com 和 example.com 是不同的,因此如果您需要重定向 example.com 上的任何内容,您可以这样做
server {
listen 80;
server_name *.example.com;
return 301 https://$server_name$request_uri;
}
或者针对每个主机进行重定向,即
server {
listen 80;
server_name www.example.com example.com images.example.com cdn.example.com;
return 301 https://$server_name$request_uri;
}
确保nginx -t
通过 nginx 重新加载进行更改时,通过测试配置并重新加载配置。您可以通过实时 http 标头或 curl 测试您获得的内容
下面的输出是我在尝试向我们使用上面精确的服务器块指向 https 的域发送 http 标头请求时看到的。
$ curl -I -L http://host.domain.com
HTTP/1.1 301 Moved Permanently
Server: nginx/1.6.2
Date: Mon, 06 Apr 2015 03:26:39 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: https://host.domain.com/
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Mon, 06 Apr 2015 03:26:41 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.5.22
Set-Cookie: PHPSESSID=dca72682392e7ac96d4b7703ea7a1eb1; path=/; domain=domain.com; secure; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=c910822f8007fe8c0424715a24aa4728; path=/; domain=domain.com; secure; HttpOnly