Nginx配置泛域名Server Block后域名跳转异常问题排查
我拥有两个域名D1(abc.com)和D2(def.com),已为D1配置如下Nginx Server Block,该配置运行正常:
server { listen 80; server_name *.abc.com,abc.com; root /var/www/abc/public; add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; index index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } error_page 404 /index.php; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } }
但为D2配置相同结构的Server Block:
server { listen 80; server_name *.def.com,def.com; root /var/www/def/public; add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; index index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } error_page 404 /index.php; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } }
执行以下命令后:
sudo ln -s /etc/nginx/sites-available/abc.com /etc/nginx/sites-enabled/ sudo ln -s /etc/nginx/sites-available/def.com /etc/nginx/sites-enabled/ sudo nginx -t //gives me ok as output sudo systemctl reload nginx sudo systemctl restart nginx
访问D2会跳转到D1。当前使用Laravel8、PHP8.1和Nginx环境,是否需要将应用部署在不同服务器?该如何解决此问题?
不需要将应用部署到不同服务器,单台Nginx服务器完全可以同时托管多个Laravel应用,问题出在以下几个细节,逐个修复即可:
修正Nginx server_name的语法错误
Nginx中server_name的多个域名之间必须用空格分隔,而不是逗号。你的配置里用了逗号分隔域名,导致Nginx无法正确匹配D2的请求,从而将请求转发到默认的server块(即先加载的D1配置)。修改两个server块的server_name:# D1的server_name server_name *.abc.com abc.com; # D2的server_name server_name *.def.com def.com;修改后重新测试Nginx配置并重启服务:
sudo nginx -t sudo systemctl restart nginx检查Laravel应用的.env配置与缓存
每个Laravel应用的.env文件必须设置对应域名的APP_URL:- D1应用(/var/www/abc/.env):
APP_URL=http://abc.com - D2应用(/var/www/def/.env):
APP_URL=http://def.com
同时清除两个应用的配置缓存,避免旧配置生效:
cd /var/www/abc && php artisan config:clear cd /var/www/def && php artisan config:clear- D1应用(/var/www/abc/.env):
处理Nginx默认server块
如果上述修改后问题仍存在,检查是否存在默认的defaultserver配置(通常位于/etc/nginx/sites-enabled/default)。如果存在,要么删除该软链接,要么在其中一个server块的listen指令后添加default_server参数(比如给D1的配置添加):listen 80 default_server;确保Nginx不会用默认配置处理未匹配的请求。
清除浏览器缓存
部分浏览器会缓存旧的跳转记录,建议使用无痕模式访问D2,或者手动清除浏览器缓存后再测试。
内容的提问来源于stack exchange,提问作者sanket gawde

