解决Nginx将子域名重定向至主域名的问题
子域名跳主站问题排查&修复
- 绕开浏览器缓存测试
别用浏览器,直接用curl测子域名的服务器响应,排除缓存干扰:
curl -I http://a.example.com curl -I http://z.example.com
- 如果返回
HTTP/1.1 200 OK,那就是浏览器缓存了之前的301跳转,清缓存或者开隐私窗口就行。 - 如果返回301且指向主站,那就是Nginx配置的匹配逻辑有问题。
- 检查Nginx配置是否生效
先确认配置语法无错误:
sudo nginx -t
没问题的话重新加载配置:
sudo nginx -s reload
再确认sites-enabled里的软链接正确指向sites-available中的对应文件:
ls -l /etc/nginx/sites-enabled/
- 修正监听配置(核心)
你当前a.example.conf和example.conf的80端口都绑定了同一个指定IP,这会导致Nginx匹配逻辑混乱。建议统一成和z.example.conf一致的监听方式:
修改a.example.conf的监听部分:
server { # 监听所有IP的80端口 listen 80; listen [::]:80; server_name a.example.com www.a.example.com; root /var/www/html/a-example/; index index.php; # 其余配置保持不变 }
这样每个子域名的server块都监听所有80端口,Nginx会根据Host头精确匹配对应的server块,不会串到主站的跳转规则里。
- 排查HSTS影响
主站的HSTS配置没加includeSubDomains,理论上不会影响子域名,但如果之前误配过,浏览器可能还缓存着规则。可以测试子域名的HTTPS响应:
curl -I https://a.example.com
如果子域名未配置HTTPS,应该返回连接失败;要是返回301到主站,清浏览器的HSTS缓存即可。
顺带解决你提到的其他问题
1. phpBB3带参数的请求重写失效
当前@rewriteapp规则会丢失URL参数,修改为以下内容即可保留参数:
location @rewriteapp { rewrite ^(.*)$ /forums/app.php$1 last; }
同时调整/forums/里的try_files规则,确保参数正常传递:
location /forums/ { try_files $uri $uri/ @rewriteapp; location ~ \.php(/|$) { include fastcgi.conf; fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; # 修改此处以保留参数 try_files $uri $uri/ /forums/app.php$is_args$args; fastcgi_param HTTP_PROXY ''; fastcgi_pass unix:/run/php/php7.4-fpm.sock; } # 其余配置不变 }
2. WordPress Shop页面跳转到phpBB3的404
当前/shop/规则优先级不足,被根目录和论坛规则拦截。修改为以下配置,单独处理shop目录的请求:
# WordPress Shop 配置 location /shop/ { try_files $uri $uri/ /shop/index.php$is_args$args; # 单独处理shop目录下的PHP文件,避免被全局规则覆盖 location ~ \.php$ { include fastcgi.conf; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_param HTTPS on; } }
另外,根目录location /中的注释PHP块建议移除,避免规则冲突。
内容的提问来源于stack exchange,提问作者Matdragon
相关产品推荐
相关产品推荐

