在443端口上区分开发环境的核心是server_name指令匹配Host头,推荐用独立子域名(如dev.example.com)对应独立server块,各配专属证书和根目录;支持通配符(*.dev.example.com)或正则匹配多测试子域;严禁混用多个域名于同一server块,未匹配域名将回退至首个或default_server标记的server块。

在同一个端口(比如标准 HTTPS 的 443)上区分不同开发环境,核心靠 server_name 指令匹配请求头里的 Host 字段——Nginx 不看路径或参数,只根据域名精准路由到对应 server 块。
用独立子域名隔离环境
这是最清晰、最推荐的做法。每个环境使用专属子域名,DNS 解析指向同一台服务器 IP,Nginx 靠 server_name 区分:
-
dev.example.com→ 开发环境 server 块,根目录/var/www/dev,用开发证书 -
staging.example.com→ 预发环境 server 块,根目录/var/www/staging,用预发证书 -
prod.example.com→ 生产环境 server 块,根目录/var/www/prod,用正式证书
每个 server 块都写 listen 443 ssl;,但 server_name 值互不重叠,Nginx 自动分流,互不影响。
用通配符或泛域名兜底
当多个测试子域(如 a.dev.example.com、b.dev.example.com)都应指向开发环境时,可配合通配符:
-
server_name *.dev.example.com;→ 匹配所有 dev 子域 -
server_name ~^([a-z0-9]+)\.dev\.example\.com$;→ 正则精确控制命名规则 - 注意:通配符不能出现在中间(如
*.dev.*.com不合法),且优先级低于精确匹配
避免混用的常见错误
别把多个环境塞进同一个 server 块里,例如:
- ❌ 错误:一个
server { listen 443; server_name dev.example.com staging.example.com; }—— 这样两个域名共用一套配置(证书、root、proxy_pass),无法差异化 - ✅ 正确:为每个域名单独写一个
server{},各自定义证书路径、静态资源目录或 upstream 地址 - ⚠️ 补充:如果某个域名没匹配到任何
server_name,Nginx 会 fallback 到第一个listen 443 ssl的 server 块(或带default_server标记的那个)
本地调试时的简易方案
没有真实域名?改本地 hosts 文件即可:
- Windows:
C:\Windows\System32\drivers\etc\hosts - macOS/Linux:
/etc/hosts - 添加几行:
127.0.0.1 dev.example.com staging.example.com - 保存后,浏览器访问
https://dev.example.com就能命中对应 server 块(需自签名证书或跳过浏览器警告)











