如何配置phpEnv以支持多级子域名站点的长尾词?
- 内容介绍
- 文章标签
- 相关推荐
本文共计820个文字,预计阅读时间需要4分钟。
phpEnv 的 Nginx 配置不读通配符 server_name
phpEnv 默认生成的虚拟主机配置里,server_name 是写死的单域名(比如 localhost 或你填的 a.test),它不会自动响应 api.a.test 或 admin.api.a.test 这类多级子域名请求——Nginx 会直接返回 404 或 fallback 到默认站点。
- 必须手动编辑 phpEnv 生成的 Nginx 配置文件(路径类似
C:\phpEnv\nginx\vhost\your-site.conf) - 把
server_name localhost;改成明确列出所有要支持的多级子域名,例如:server_name a.test api.a.test admin.api.a.test; - 不能只写
server_name *.a.test;—— phpEnv 所用的 Nginx 版本(通常为 1.16+)虽支持通配符,但仅限一级(如*.a.test匹配api.a.test,但不匹配dev.api.a.test) - 改完后必须点击 phpEnv 界面的「重载 Nginx」或命令行执行
nginx -t && nginx -s reload,否则配置不生效
hosts 文件必须逐条映射多级子域名
Windows/macOS 的 /etc/hosts 不支持通配符解析,127.0.0.1 *.a.test 是无效语法,系统会直接忽略该行。
- 每个要测试的多级子域名都得单独加一行,例如:
127.0.0.1 a.test127.0.0.1 api.a.test127.0.0.1 admin.api.a.test - 顺序无关,但必须确保没有拼写错误(比如少个点、大小写混用);浏览器缓存 DNS 时,可执行
ipconfig /flushdns(Win)或sudo dscacheutil -flushcache(macOS)清空 - 如果用的是 phpEnv 自带的 Apache 模式(非默认),则需同步修改 Apache 的
vhosts.conf,且ServerName同样要显式列出全部子域名
PHP 层要用 $_SERVER['HTTP_HOST'] 做精确匹配
即使 Nginx 把请求转进来了,PHP 默认也不区分 a.test 和 api.a.test——它们共享同一套 $_SERVER 变量,除非你主动判断。
立即学习“PHP免费学习笔记(深入)”;
- 不要依赖
$_SERVER['SERVER_NAME']:它取自 Nginx 的server_name指令值,是静态配置,不是真实请求头 - 必须用
$_SERVER['HTTP_HOST']获取浏览器实际发送的 Host 头,再做字符串判断,例如:if (strpos($_SERVER['HTTP_HOST'], 'api.') === 0) { /* 走 API 路由 */ }if (preg_match('/^admin\.api\./', $_SERVER['HTTP_HOST'])) { /* 管理后台专用逻辑 */ } - 注意:如果 Nginx 配置了
underscores_in_headers on,而 Host 头含下划线,HTTP_HOST可能为空——多级子域名一般不用下划线,但得知道这个坑
真正麻烦的不是配置数量,而是每新增一个三级子域名(比如 mobile.admin.api.a.test),你就得同步改三处:Nginx server_name、hosts 文件、PHP 判断逻辑。漏任何一处,请求就静默失败或进错项目目录。
本文共计820个文字,预计阅读时间需要4分钟。
phpEnv 的 Nginx 配置不读通配符 server_name
phpEnv 默认生成的虚拟主机配置里,server_name 是写死的单域名(比如 localhost 或你填的 a.test),它不会自动响应 api.a.test 或 admin.api.a.test 这类多级子域名请求——Nginx 会直接返回 404 或 fallback 到默认站点。
- 必须手动编辑 phpEnv 生成的 Nginx 配置文件(路径类似
C:\phpEnv\nginx\vhost\your-site.conf) - 把
server_name localhost;改成明确列出所有要支持的多级子域名,例如:server_name a.test api.a.test admin.api.a.test; - 不能只写
server_name *.a.test;—— phpEnv 所用的 Nginx 版本(通常为 1.16+)虽支持通配符,但仅限一级(如*.a.test匹配api.a.test,但不匹配dev.api.a.test) - 改完后必须点击 phpEnv 界面的「重载 Nginx」或命令行执行
nginx -t && nginx -s reload,否则配置不生效
hosts 文件必须逐条映射多级子域名
Windows/macOS 的 /etc/hosts 不支持通配符解析,127.0.0.1 *.a.test 是无效语法,系统会直接忽略该行。
- 每个要测试的多级子域名都得单独加一行,例如:
127.0.0.1 a.test127.0.0.1 api.a.test127.0.0.1 admin.api.a.test - 顺序无关,但必须确保没有拼写错误(比如少个点、大小写混用);浏览器缓存 DNS 时,可执行
ipconfig /flushdns(Win)或sudo dscacheutil -flushcache(macOS)清空 - 如果用的是 phpEnv 自带的 Apache 模式(非默认),则需同步修改 Apache 的
vhosts.conf,且ServerName同样要显式列出全部子域名
PHP 层要用 $_SERVER['HTTP_HOST'] 做精确匹配
即使 Nginx 把请求转进来了,PHP 默认也不区分 a.test 和 api.a.test——它们共享同一套 $_SERVER 变量,除非你主动判断。
立即学习“PHP免费学习笔记(深入)”;
- 不要依赖
$_SERVER['SERVER_NAME']:它取自 Nginx 的server_name指令值,是静态配置,不是真实请求头 - 必须用
$_SERVER['HTTP_HOST']获取浏览器实际发送的 Host 头,再做字符串判断,例如:if (strpos($_SERVER['HTTP_HOST'], 'api.') === 0) { /* 走 API 路由 */ }if (preg_match('/^admin\.api\./', $_SERVER['HTTP_HOST'])) { /* 管理后台专用逻辑 */ } - 注意:如果 Nginx 配置了
underscores_in_headers on,而 Host 头含下划线,HTTP_HOST可能为空——多级子域名一般不用下划线,但得知道这个坑
真正麻烦的不是配置数量,而是每新增一个三级子域名(比如 mobile.admin.api.a.test),你就得同步改三处:Nginx server_name、hosts 文件、PHP 判断逻辑。漏任何一处,请求就静默失败或进错项目目录。

