如何在Nginx中配置规则批量代理所有子域名,无需重复Server块?
Nginx批量代理子域名配置方案
你直接用server_name *.my.domain;搭配proxy_pass https://*.remote.com/;和proxy_set_header Host *.remote.com;是不可行的——Nginx不支持在proxy_pass和proxy_set_header里直接用通配符*匹配子域名,得通过变量动态提取请求中的子域名部分来实现批量代理。
实现思路
- 用
server_name *.my.domain;匹配所有my.domain的子域名请求(如果要同时兼容主域名my.domain,可以写成server_name my.domain *.my.domain;) - 通过正则或
map指令从请求主机名中提取子域名,生成目标域名变量 - 将变量代入
proxy_pass和Host头,实现对应子域名的代理
推荐配置(用map指令,更稳妥)
# 在server块外部添加map规则,处理域名映射 map $host $target_domain { default ""; my.domain remote.com; ~^(.+)\.my\.domain$ $1.remote.com; } server { listen 6799 default_server ssl http2; server_name my.domain *.my.domain; # SSL Configuration ssl_certificate /home/nginxproxymanager/letsencrypt/live/npm-4/fullchain.pem; ssl_certificate_key /home/nginxproxymanager/letsencrypt/live/npm-4/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; location / { proxy_pass https://$target_domain/; proxy_ssl_server_name on; proxy_ssl_session_reuse off; proxy_redirect off; proxy_set_header Host $target_domain; proxy_hide_header "Cache-Control"; add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"; proxy_hide_header "Pragma"; add_header Pragma "no-cache"; expires -1; add_header Last-Modified $sent_http_Expires; 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; } }
配置说明
map指令是Nginx处理变量映射更安全的方式,避免if指令的潜在问题- 正则
~^(.+)\.my\.domain$会提取子域名部分:比如img.my.domain会提取出img,自动拼接成img.remote.com - 主域名
my.domain直接映射到remote.com,保留原有代理逻辑
内容的提问来源于stack exchange,提问作者sirzento
相关产品推荐
相关产品推荐

