这是我的域名的 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 的“通配符”配置)