Nginx需用server_name ~\.(test|dev)$正则匹配域名后缀,配合proxy_pass http://127.0.0.1:3000/实现自动代理;注意转义点号、结尾$、尾部斜杠路径截断规则,并确认phpEnv配置加载路径与端口占用问题。

phpEnv 本身不支持基于域名后缀(如 .dev、.test)的自动反向代理,必须手动编辑 Nginx 配置文件,用 server_name + 正则匹配实现。直接依赖 phpEnv 图形界面或“一键代理”功能会失败。
如何用 server_name 正则匹配域名后缀
Nginx 的 server_name 支持通配符和正则,但需以波浪线 ~ 开头启用正则模式。比如想把所有 .test 结尾的请求都代理到本地 http://127.0.0.1:3000:
server {
listen 80;
server_name ~\.(test|dev)$;
location / {
proxy_pass http://127.0.0.1:3000/;
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;
}
}
注意几点:
-
server_name ~\.(test|dev)$中的\.是转义点号,$表示结尾,不能漏 - 多个后缀用括号包裹、竖线分隔,如
(test|dev|local) - 该配置需放在
nginx.conf的http块内,不能塞进某个站点的location里 - phpEnv 默认不加载额外 conf 文件,得确认
include是否覆盖到你的自定义配置路径(常见为D:\phpenv\nginx\conf\extra\*.conf)
为什么 proxy_pass 后加不加 / 影响实际转发路径
proxy_pass 末尾的斜杠决定 URL 路径是否被截断。这是最容易出错的地方:
立即学习“PHP免费学习笔记(深入)”;
-
proxy_pass http://127.0.0.1:3000/;→ 请求http://api.test/user会被转发为http://127.0.0.1:3000/user(去掉匹配前缀) -
proxy_pass http://127.0.0.1:3000;(无尾部斜杠)→ 同样请求会变成http://127.0.0.1:3000/api.test/user(完整保留 host 和 path) - 后端服务通常不期望收到带域名的 path,所以绝大多数情况必须加尾部
/
phpEnv 下修改配置后不生效的三个高频原因
改完配置保存,重启 phpEnv 里的 Nginx,仍 404 或连接拒绝?优先查这三项:
-
nginx -t报语法错误:phpEnv 自带的 Nginx 版本较老(常为 1.16–1.20),不支持某些新语法(如proxy_http_version 1.1在部分旧版中需显式开启) - Windows 下路径分隔符写成
/没问题,但若引用了绝对路径(如root D:\phpenv\nginx\html\frontend;),确保盘符大写与实际一致,且路径末尾不带多余空格 - 防火墙或杀毒软件拦截了 80 端口:phpEnv 默认监听 80,但 Windows 10/11 常有 IIS 或 Web Deployment Agent Service 占用该端口,用
netstat -ano | findstr :80查 PID,再用任务管理器结束对应进程
真正麻烦的是多级嵌套匹配——比如既要按后缀路由,又要对 /api/ 子路径做 WebSocket 升级,这时 location 块的优先级和 proxy_set_header Connection "upgrade" 的位置稍有偏差,整个升级就会静默失败。别指望图形界面能覆盖这类逻辑,手写配置时务必逐行对照 Nginx error log(位于 D:\phpenv\nginx\logs\error.log)定位哪一行没生效。



















