Nginx本地开发配置异常:子域名加载主站index.php
嘿,我来帮你排查这个头疼的问题!这种子域名都跳主站的情况,大多是Nginx配置里的几个小疏漏,咱们一步步来揪出问题:
1. 先查主站的默认服务器配置
首先得确认你的主站(mylocalhost.com)配置是不是把自己设成了默认服务器。如果主站的listen指令加了default_server,而子域名的配置没被正确匹配,Nginx就会把所有没匹配上的请求都丢给主站处理。
比如主站要是这么写就容易出问题:
server { listen 80 default_server; server_name mylocalhost.com; # ... 其他主站配置 }
解决办法:要么确保子域名的配置文件被Nginx正确加载(比如放在/etc/nginx/sites-enabled/目录下),要么如果主站不是默认要处理所有请求的话,把default_server去掉,或者把默认服务器指向常用的子域名配置。
2. 补全子域名配置里的关键项
从你给的nowingnews.mylocalhost.com配置片段来看,你没写完root(根目录)和index的设置——这大概率是核心问题!如果子域名的server块没指定自己的根目录,Nginx会用全局的根目录配置,而全局配置可能刚好指向主站的目录,自然就加载主站的index.php了。
给你补全一个正确的子域名配置模板,你照着改:
server { listen 80; server_name nowingnews.mylocalhost.com; # 日志最好分开,方便排查问题 access_log /var/log/nginx/nowingnews_access.log; error_log /var/log/nginx/nowingnews_error.log; # 重点!指定这个子域名对应的项目根目录 root /var/www/nowingnews; # 换成你实际的项目路径 index index.php index.html index.htm; # 如果是PHP项目,必须有这段PHP处理配置 location ~ \.php$ { fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 换成你自己的PHP-FPM套接字路径,比如php8.2-fpm.sock fastcgi_index index.php; # 这里一定要用$document_root,不能硬编码主站路径! fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
特别注意SCRIPT_FILENAME这一行,要是写成固定的主站路径,哪怕根目录对了,PHP还是会加载主站的文件。
3. 让配置生效,别忘测试!
改完配置后,先别急着重启,先测试配置有没有语法错误:
sudo nginx -t
如果提示test is successful,再重新加载Nginx(不中断服务):
sudo systemctl reload nginx
要是测试报错,先把语法问题修好,比如括号没关、路径不存在这些小问题。
4. 确认本地DNS解析没错
你得确保本地的hosts文件里已经加了子域名的解析,不然浏览器找不到你的本地服务器:
- Windows:
C:\Windows\System32\drivers\etc\hosts - Linux/macOS:
/etc/hosts
在文件里加这几行:
127.0.0.1 mylocalhost.com 127.0.0.1 nowingnews.mylocalhost.com 127.0.0.1 wasob.mylocalhost.com
保存后,刷新DNS缓存(Windows用ipconfig /flushdns,Linux/macOS用sudo dscacheutil -flushcache)。
5. 清掉浏览器缓存再测试
有时候浏览器会缓存旧的页面或者DNS记录,你改了配置还是看到主站。试试用Ctrl+Shift+R(Windows/Linux)或者Cmd+Shift+R(macOS)强制刷新,或者直接清空浏览器的缓存和Cookie。
6. 看日志找线索
如果还是不行,去看子域名的access日志(比如/var/log/nginx/nowingnews_access.log),看看请求的Host头是不是nowingnews.mylocalhost.com,还有请求的文件路径是不是指向了主站的目录。这能帮你快速判断是Nginx没匹配到正确的server块,还是路径配置错了。
内容的提问来源于stack exchange,提问作者user3681312

