Nginx 配置 https 后,http 强制跳转到 https,主域名跳转至带 www 的二级域名

  • 为了随主流,即大多数人的习惯,访问时网站时,域名随时保持带 www 的二级域名 www.lovesofttech.com
  • 另外,网站的统计也是基于二级域名 www.lovesofttech.com 的,同时为了搜索引擎优化,访问 lovesofttech.com 时需要跳转到 www.lovesofttech.com
  • 网站开通了 ssl 证书,需要将 http 强制跳转至 https

完整配置内容

# 针对 http 协议,将 @ 记录,即不带 www 的主域名 http://lovesofttech.com 跳转至带 www 的二级域名 http://www.lovesofttech.com,域名后面的路径以及参数保持不变
# 如果配置了 htts 协议的跳转,这个server配置可以不要。
server {
  listen 80;
  server_name lovesofttech.com;
  rewrite ^(.*)$ https://www.$server_name$1 permanent;
}

# 如果配置了上面的 http 协议的主域名 http://lovesofttech.com 跳转至二级域名 https://www.lovesofttech.com,则下面这个server的配置可以把主域名 lovesofttech.com 去掉
server {
    listen 80;
    server_name  www.lovesofttech.com lovesofttech.com;
    rewrite ^(.*)$ https://$host$1 permanent;
}

# 以下 server 配置 ssl 协议,注意端口不再是80而是443 
server {
    listen 443;
    server_name  www.lovesofttech.com lovesofttech.com;
    charset utf-8;
    access_log  logs/lovesofttech.access.log;
    error_log   logs/lovesofttech.error.log;
    ssl on;
    ssl_certificate /usr/local/nginx/cert/2944536_www.lovesofttech.com.pem;
    ssl_certificate_key /usr/local/nginx/cert/2944536_www.lovesofttech.com.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    # 针对 https 协议,将 @ 记录,即不带 www 的主域名 https://lovesofttech.com 跳转至带 www 的二级域名 https://www.lovesofttech.com,域名后面的路径以及参数保持不变
    if ($host != 'www.lovesofttech.com') {
        rewrite ^/(.*)$ https://www.lovesofttech.com/$1 permanent;
    }

    location / {
        root   /home/utomcat/gitCode/lovesoft/uncleAndyChen/public;
        index  index.html;
    }
}

后记

带路径时不会重定向

之前的主域名 http://lovesofttech.com 跳转至带 www 的二级域名 https://www.lovesofttech.com,是在阿里云的域名解析里做的,是一个域名重定向的配置。
域名重定向配置
可以设置301重定向,也可以设置成302重定向

这样配置带来的问题是,只有主页 http://lovesofttech.com 才会重定向到 https://www.lovesofttech.com,带路径的文章如 https://lovesofttech.com/about/ 就不会重定向,而且显示无法访问。

在百度里搜索:site:lovesofttech.com,得到的结果,不带 www 的主域名且带路径的文章链接,如 https://lovesofttech.com/about/ ,均无法访问。

解决

修改主域名解析配置为 A 记录,记录值直接指向服务器IP。
域名重定向配置

这样配置之后,https://lovesofttech.com/about/ 这样的链接已经可以正常访问了,但是不利于网站统计和搜索引擎优化(时髦词叫 SEO),所以,还需要通过 Nginx 配置来重定向。

没有开通 ssl 证书的重定向配置

server {
  listen 80;
  server_name lovesofttech.com;
  rewrite ^(.*)$ https://www.$server_name$1 permanent;
}

开通了 ssl 证书的重定向配置

修改监听 443 端口的 server 配置,在 location 配置前面加上:

    if ($host != 'www.lovesofttech.com') {
        rewrite ^/(.*)$ https://www.lovesofttech.com/$1 permanent;
    }

具体可参考上面的完整配置内容。

关于作者

<think>嗯,用户想知道如何在Nginx中同时为主域名和子域名配置HTTPS。首先,我需要回忆一下Nginx配置HTTPS的基本步骤,比如需要SSL证书、配置server块等等。主域名和子域名可能涉及到多个server块,每个块监听不同的域名。 首先,用户可能需要为每个域名申请SSL证书。主域名比如example.com,子域名比如sub.example.com。每个证书可能需要单独的证书文件,或者使用通配符证书。如果是通配符证书,*.example.com可以覆盖所有子域名,这样可能更方便。不过用户可能没有通配符证书,所以可能需要分别配置。 然后,Nginx配置文件中需要为每个域名设置server块,监听443端口,并指定各自的SSL证书和密钥路径。每个server块中的server_name要分别设置为主域名和子域名。这样当请求到达时,Nginx会根据server_name来匹配对应的配置。 另外,可能还需要处理HTTPHTTPS的重定向,即监听80端口的请求,并返回301重定向到HTTPS的对应域名。这时候每个server块里的重定向需要正确指向各自的HTTPS地址,避免循环或者错误的重定向。 还要注意SSL的配置参数,比如协议版本、加密套件等,确保安全性和兼容性。可能还需要配置HSTS,强制浏览器使用HTTPS连接。 用户可能遇到的问题包括证书路径错误、权限问题、配置语法错误导致Nginx无法重启,或者证书不匹配导致浏览器警告。需要检查Nginx的error日志来排查这些问题。 另外,如果用户有多个子域名,可能需要考虑使用通配符证书来简化配置,否则每个子域名都需要单独的证书,管理起来比较麻烦。但通配符证书可能需要更高的成本或者不同的申请流程。 最后,配置完成后,用户需要用nginx -t测试配置是否正确,然后重新加载配置使更改生效。之后通过浏览器访问主域名和子域名,确认HTTPS正常工作,没有证书错误,并且内容正确显示。 可能还需要引用站内的相关参考资料,比如引用[2]提到配置多个域名含二级域名的情况,引用[5]展示了两个域名的SSL证书路径配置,这些都可以作为参考。确保每个server块正确指定证书路径和域名,避免混淆。</think>### Nginx 中同时为主域名和子域名配置 HTTPS 的步骤 #### 1. **准备 SSL 证书** - **主域名**(如 `example.com`)和**子域名**(如 `sub.example.com`)需要各自的 SSL 证书。 - 可通过免费证书(如 Let's Encrypt)或购买商业证书获取。若使用通配符证书(如 `*.example.com`),可覆盖所有子域名[^5]。 #### 2. **证书文件存放** 假设证书文件路径如下: - 主域名证书:`/etc/nginx/cert/main/fullchain.pem` - 主域名私钥:`/etc/nginx/cert/main/privkey.pem` - 子域名证书:`/etc/nginx/cert/sub/fullchain.pem` - 子域名私钥:`/etc/nginx/cert/sub/privkey.pem` #### 3. **配置 NginxHTTPS 服务** 在 `nginx.conf` 或站点配置文件中添加以下内容: ```nginx # 主域名配置 server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/cert/main/fullchain.pem; ssl_certificate_key /etc/nginx/cert/main/privkey.pem; # SSL 通用优化配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; # 其他配置(如反向代理、静态资源路径) location / { root /var/www/main; index index.html; } } # 子域名配置 server { listen 443 ssl; server_name sub.example.com; ssl_certificate /etc/nginx/cert/sub/fullchain.pem; ssl_certificate_key /etc/nginx/cert/sub/privkey.pem; # SSL 通用优化配置(同上) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; # 其他配置 location / { proxy_pass http://localhost:8080; # 示例:反向代理到本地端口 } } # HTTP 强制跳转 HTTPS server { listen 80; server_name example.com sub.example.com; return 301 https://$host$request_uri; # 自动跳转HTTPS } ``` #### 4. **验证与重启 Nginx** ```bash nginx -t # 检查配置语法 systemctl reload nginx # 重新加载配置 ``` #### 5. **常见问题排查** - **证书路径错误**:查看 Nginx 错误日志 `tail -f /var/log/nginx/error.log`。 - **域名不匹配**:确保 `server_name` 与证书的域名一致[^2]。 - **端口冲突**:检查是否有其他服务占用 443 或 80 端口。 --- ### 相关问题 1. **如何申请免费的 SSL 证书(如 Let's Encrypt)?** 2. **通配符证书和单域名证书有什么区别?** 3. **Nginx 配置 HTTPS 时如何优化 SSL 性能?** --- ### 引用说明 [^1]: 若出现证书问题或域名未备案提示,需检查证书配置或联系域名服务商。 : 多域名配置需为每个域名单独设置 `server` 块并指定证书路径。 : 证书路径需在 `ssl_certificate` 和 `ssl_certificate_key` 中正确声明。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值