我正在尝试将 nginx 配置为按以下方式工作:顶级域名(例如 example.com)通过 HTTP 访问,重定向到 HTTPS。其所有子域也必须重定向到 HTTPS(显然,子域必须重定向到其自身,但使用 HTTPS)。
以下是配置(文件default
):
server {
listen 80;
listen [::]:80;
server_name example.com *.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
server_name example.com www.example.com;
root /home/user/wwwroot;
index index.html index.htm index.nginx-debian.html;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
以下是“yt”子域名的配置(文件yt
)
server {
listen 443 ssl;
server_name yt.example.com;
location ^~ /.well-known {
allow all;
root /home/user/wwwroot;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:8080;
}
}
可以看出,yt.example.com 只是将请求传递给应用程序(在本例中为 Youtrack)。
重定向 example.com 和 www.example.com 工作正常,但重定向 yt.example.com 时行为异常。当我访问http://yt.example.com,nginx 重定向到https://yt.example.com,但提供文件root /home/user/wwwroot
中指定的内容default
。当我点击刷新按钮时,我的浏览器会重新加载页面https://yt.example.com然后 nginx 按照我的预期将请求传递给应用程序。因此,当它将 HTTP 重定向到 HTTPS 时,它不会传递请求,但当请求已经使用 HTTPS 时,它会成功重定向。
我不是 nginx 专家,所以我需要一些帮助。
更新。
@Tim 要求使用“curl -i”,因此这里是输入curl -i yt.example.com
:
HTTP/1.1 301 Moved Permanently
Server: nginx/1.10.0 (Ubuntu)
Date: Thu, 06 Apr 2017 09:08:26 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Location: https://yt.example.com/
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.10.0 (Ubuntu)</center>
</body>
</html>
这是 curl 的全部输出。
现在 nginx 的日志。错误日志为空(请求不在错误日志中),访问日志包含以下行:
188.242.1.152 - - [06/Apr/2017:09:17:12 +0000] "GET / HTTP/1.1" 301 194 "-" "curl/7.40.0"
并且访问日志不包含其他任何内容。
更新2。
非常抱歉,配置完 nginx 后我忘记清除浏览器的缓存了。所以浏览器实际上没有向我的服务器发出任何请求。
答案1
在您的 http 服务器中,将服务器名称更改为您需要的子域。
server_name example.com www.example.com whatever.example.com;
我不确定这是否会起作用,但这是首先要排除的事情。
如果没有帮助,请使用“curl -i”来演示问题,并匹配 Nginx 访问和错误日志。您还应该检查应用程序日志。
顺便说一句,你可能不想在https://example.com和https://www.example.com。您可以使用类似这样的块将 www 转发到根域。
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
当然,您需要从其他服务器块中删除该域。如果您想在 www 上提供服务并转发根域,那么交换一下就很简单了。