Nginx 配置 HTTPS 站点时需要注意的几个细节

Nginx 配置 HTTPS 并不只是把证书路径写上去。实际部署中,很多访问异常都来自 server_name、证书链、HTTP 跳转、PHP 转发参数或反向代理头部配置不完整。

一、server_name 要和域名一致

如果一个站点需要同时支持主域名和 www 域名,应在同一个 server 块中同时写入。 下面使用的是占位域名,不代表真实站点。

server_name example.test www.example.test;

同时,证书也必须包含这两个域名。否则其中一个域名访问 HTTPS 时可能提示证书不匹配。

二、HTTP 跳转 HTTPS

常见做法是监听 80 端口,然后统一跳转到 HTTPS。

server {
    listen 80;
    listen [::]:80;
    server_name example.test www.example.test;

    return 301 https://$host$request_uri;
}

三、证书路径和完整证书链

证书文件建议使用包含中间证书的完整链文件,例如 bundle 或 fullchain 文件。

ssl_certificate /etc/nginx/ssl/example.test_bundle.crt;
ssl_certificate_key /etc/nginx/ssl/example.test.key;

如果证书链不完整,部分浏览器或客户端可能出现证书验证失败。

四、PHP 站点要正确传递脚本路径

如果站点需要运行 PHP,需要确认 php-fpm socket 路径正确,并设置 SCRIPT_FILENAME。

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;

    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT $realpath_root;
}

五、修改配置后先测试再重载

每次修改 Nginx 配置后,不建议直接 reload,应该先执行配置测试。

sudo nginx -t
sudo systemctl reload nginx

六、谨慎开启 HSTS

HSTS 可以强制浏览器后续使用 HTTPS 访问网站,但一旦设置较长时间,如果 HTTPS 配置错误,用户可能无法临时回退到 HTTP。 建议确认 HTTPS 稳定后再开启较长 max-age。

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

总结

HTTPS 配置应重点检查域名匹配、证书链、监听端口、跳转规则、PHP 或反代参数。 修改配置后先执行 nginx -t,可以避免因为语法错误导致服务异常。