我有一个客户,我正在为他整理迁移到更新/更快的服务器后的事情。其中一项工作是引入 SSL 支持,并标准化链接/URL。
目标是强制使用 HTTPS(他们以前从未这样做过),并重写所有 URL 以包含 www. 前缀。我的结果并不像预期的那样,但我以前从未这样做过,而且文档也没有具体描述如何做到这一点。这是我得到的结果:
server {
listen 80;
server_name domain.com www.domain.com;
rewrite ^ https://www.domain.com$request_uri? permanent;
}
server {
listen 443 ssl;
server_name domain.com;
#rewrite ^ https://www.domain.com$request_uri? permanent;
ssl on;
ssl_certificate /etc/nginx/ssl.d/domain.com.crt;
ssl_certificate_key /etc/nginx/ssl.d/domain.com.key;
ssl_session_timeout 30m;
.....rest of vhost config in here.....
}
在 URL 栏中输入上述内容后,结果如下:
http://domain.com -> https://www.domain.com
http://www.domain.com -> https://www.domain.com
**https://domain.com -> https://domain.com**
https://www.domain.com -> https://www.domain.com
问题在于 SSL,非 WWW url。这不会强制执行 WWW 前缀,而我需要它。我尝试使用上面注释掉的行来执行此操作。但这导致了重定向循环(这确实是意料之中的,但我不知道如何做)。
有什么想法吗?这是服务器上唯一的域名,目前尚未启用,所以我可以尝试任何方法。谢谢。
答案1
如果我正确理解了你的问题的话,下面是我做的方法。
# Redirect all variations to https://www domain
server {
listen 80;
access_log /var/log/nginx/example.access.log main buffer=128k flush=60 if=$log_ua;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /var/lib/acme/certs/xx/fullchain;
ssl_certificate_key /var/lib/acme/certs/xx/privkey;
access_log /var/log/nginx/example.access.log main buffer=128k flush=60 if=$log_ua;
# Set up preferred protocols and ciphers. TLS1.2 is required for HTTP/2
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
# This is a cache for SSL connections
ssl_session_cache shared:SSL:2m;
ssl_session_timeout 60m;
return 301 https://www.example.com$request_uri;
}