Skip to content

server 匹配

server 块用于定义虚拟主机。一次请求进入 Nginx 后,先根据 listen 选择端口,再根据 Host 请求头匹配 server_name

基本配置

nginx
server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        root /var/www/example.com;
        index index.html;
    }
}

默认站点

default_server 用于兜底处理未匹配到域名的请求:

nginx
server {
    listen 80 default_server;
    server_name _;

    return 444;
}

如果没有显式配置 default_server,Nginx 会使用同一 listen 地址下第一个 server 作为默认站点。

server_name 匹配

常见写法:

nginx
server_name example.com www.example.com;
server_name *.example.com;
server_name example.*;
server_name ~^www\d+\.example\.com$;

匹配优先级:

  1. 精确名称,例如 example.com
  2. 最长的前缀通配符,例如 *.example.com
  3. 最长的后缀通配符,例如 example.*
  4. 按配置顺序匹配正则名称,例如 ~^www\d+\.example\.com$
  5. 默认站点。

多域名跳转

将裸域跳转到 www

nginx
server {
    listen 80;
    server_name example.com;

    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
}

常见问题

配置了域名但不生效

检查点:

  • DNS 是否解析到当前服务器。
  • server_name 是否包含请求的 Host
  • 是否有其他 default_server 或更早的同端口配置抢先匹配。
  • 修改后是否执行 nginx -t 和 reload。

使用 IP 访问命中了业务站点

给同端口配置一个默认站点:

nginx
server {
    listen 80 default_server;
    server_name _;

    return 444;
}

基于 MIT 许可发布