Windows nginx模板: 拆分80/443 server块,修复HTTPS强制跳转死循环风险
This commit is contained in:
@@ -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;` 强制跳转。
|
||||
|
||||
Reference in New Issue
Block a user