如何使用 Nginx 处理对不存在的子域的请求

如何使用 Nginx 处理对不存在的子域的请求

这是我的域名的 Nginx 配置example.com,它服务于一个简单的静态网站。

server {
    root /var/www/example.com;

    index index.html index.htm index.nginx-debian.html;

    server_name example.com www.example.com;

    location / {
        try_files $uri $uri/ =404;
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

如何配置 Nginx,使其在导航到诸如 之类的子域时返回 404 asdf.example.com?现在我发现自己正在查看与 相同的页面example.com

我为我的域名设置了通配符 A 记录,因此我希望所有以 结尾的请求example.com都能找到我的服务器。我是否必须删除通配符,或者我可以使用 Nginx 处理这些对子域的请求?

答案1

Nginxserver_name配置允许使用正则表达式,或者更简单的*通配符,请参阅https://nginx.org/en/docs/http/ngx_http_core_module.html#server_name

因此,这两个中的任何一个都应该匹配任何名称(而不是由另一个块更好地匹配)

server_name *.example.com
server_name ~^.+\.example\.com$

(使用正则表达式时需要 ~)。

您甚至可以捕获名称的一部分,并在后续配置指令中使用它。上面的文档链接有相关示例。

而且您确实需要 DNS 通配符,否则流量将无法到达您的 Web 服务器(或者如果没有 DNS 通配符,您需要为要解析的名称提供特定记录,无论有多少个,并且仍然保留 Nginx 的“通配符”配置)

相关内容