对于未找到的子域名,显示 404 错误,而不是显示根域名的内容

对于未找到的子域名,显示 404 错误,而不是显示根域名的内容

我正在使用 nginx。我想实现的目标:

  • 根域domain.com,从以下域获取内容/var/www/domain.com
  • sub.domain.com获取内容的子域名/var/www/sub.domain.com
  • 任何其他子域名*.domain.com(其中*!= sub)应从中获取内容/var/www/404

如果这还不清楚:它类似于 StackEchange 设置,其中http://somesub.stackexchange.com/给出 404。

我成功地使用两个具有不同 s 的服务器块进行了第一次尝试。但是,当找不到与子域匹配的服务器块时,server_name我该如何设置要链接的 nginx ?/var/www/404

通过基本设置,所有未找到的子域都会返回与根域相同的内容。

我想使其具有通用性,这样,如果我为其添加另一个服务器块sub2.domain.com,则不必更改 404 的块。

我现在使用的代码:

server {
    listen 80;
    server_name domain.com;
    root /var/www/domain.com;
    charset utf-8;

    location / {
        index index.php index.html;
        autoindex on;
    }

    location ~ \.php$ {
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }
}

server {
    listen 80;
    server_name sub.domain.com;
    root /var/www/sub.domain.com;
    charset utf-8;

    location / {
        index index.php index.html;
        autoindex on;
    }

    location ~ \.php$ {
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }
}

答案1

Nginx 与 Apache 一样,始终将配置列表中的第一个域用作默认域。 就您而言,这意味着对于没有自己的配置的任何域,它将选择 domain.com 的配置,因为这是第一个。

因此,解决方案很简单,只需设置另一个仅包含 404 页面的域,并将其作为列出的第一个域。然后,您可以根据需要添加任意多个特定域;仅当配置文件中没有其他匹配的域名时,才会使用第一个域。

相关内容