You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx配置泛域名Server Block后域名跳转异常问题排查

问题:访问域名D2(def.com)跳转到D1(abc.com)的解决方法?

我拥有两个域名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
    
  • 处理Nginx默认server块
    如果上述修改后问题仍存在,检查是否存在默认的default server配置(通常位于/etc/nginx/sites-enabled/default)。如果存在,要么删除该软链接,要么在其中一个server块的listen指令后添加default_server参数(比如给D1的配置添加):

    listen 80 default_server;
    

    确保Nginx不会用默认配置处理未匹配的请求。

  • 清除浏览器缓存
    部分浏览器会缓存旧的跳转记录,建议使用无痕模式访问D2,或者手动清除浏览器缓存后再测试。


内容的提问来源于stack exchange,提问作者sanket gawde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:12:10