Windows nginx模板: 拆分80/443 server块,修复HTTPS强制跳转死循环风险

This commit is contained in:
2026-09-11 16:43:00 +08:00
parent fc51641700
commit 88832e6084
+33 -6
View File
@@ -7,17 +7,35 @@
# 2. 将本文件内容追加/替换到 C:\nginx\conf\nginx.conf 的 http{} 块内
# (或用 include 语法:在 http{} 块中加一行 include wagtailcms.conf;,
# 并把本文件放到 C:\nginx\conf\wagtailcms.conf)
# 3. 将下面的 example.com / cms.example.com 替换为真实域名
# 3. 将下面的 example.com / cms.example.com 替换为真实域名,
# ssl_certificate / ssl_certificate_key 替换为实际证书路径
# 4. nginx.exe -t 测试配置,nginx.exe -s reload 重载
#
# 架构:浏览器 -> Nginx(TLS 终止) -> {Next.js:3000(页面渲染) | waitress:8080(/admin /api /static /media 等后端路径)}
#
# 每个域名各拆成两个 server 块:80 端口只做 301 强制跳转到 https,
# 443 端口才真正反代到后端。不要把 listen 80/443 合并进同一个 server 块,
# 否则容易漏配 X-Forwarded-Proto,与 Django 的 SECURE_SSL_REDIRECT 互相 301,造成死循环。
# ---------------------------------------------------------------------------
# 后端管理域名(Wagtail 管理后台 / API),对应 WAGTAILADMIN_BASE_URL
# ---------------------------------------------------------------------------
# 80 端口只做强制跳转,不直接反代到后端——
# 否则 Django 的 SECURE_SSL_REDIRECT 会自己再 301 一次,且容易和下面的 443 块配置不一致导致循环跳转。
server {
listen 80;
server_name cms.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name cms.example.com;
# 证书路径按实际下载/申请到的文件替换(win-acme 或 阿里云 SSL 证书服务下载 Nginx 格式证书)
ssl_certificate C:/nginx/ssl/cms.example.com.pem;
ssl_certificate_key C:/nginx/ssl/cms.example.com.key;
client_max_body_size 20m;
@@ -38,7 +56,10 @@ server {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 关键:必须显式写死 https,不要用 $scheme——
# 这个 server 块本身只监听 443,$scheme 理论上恒为 https,
# 但显式写死可以避免因为把该 location 误复制到 80 块时引发同样的死循环问题。
proxy_set_header X-Forwarded-Proto https;
}
}
@@ -48,6 +69,15 @@ server {
server {
listen 80;
server_name www.example.com example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com example.com;
ssl_certificate C:/nginx/ssl/example.com.pem;
ssl_certificate_key C:/nginx/ssl/example.com.key;
client_max_body_size 20m;
@@ -63,10 +93,7 @@ server {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Proto https;
}
}
# 提示:申请到证书后(win-acme / 阿里云 SSL 证书服务下载 Nginx 格式证书),
# 手动加 `listen 443 ssl;` + `ssl_certificate`/`ssl_certificate_key` 指令,
# 并在 80 端口 server 块中加 `return 301 https://$host$request_uri;` 强制跳转。