如何在 Nginx 中将非 WWW 重写为 WWW 并强制执行 HTTPS

如何在 Nginx 中将非 WWW 重写为 WWW 并强制执行 HTTPS

我有一个客户,我正在为他整理迁移到更新/更快的服务器后的事情。其中一项工作是引入 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;
}

相关内容