在 Nginx 中,server_name 指令用于指定一个虚拟主机(server block)所应响应的域名或主机名。通过配置 server_name,Nginx 可以根据请求的域名将请求路由到正确的虚拟主机。以下是对 server_name 的详细介绍:
基本用法
server_name 指令通常用于 server 块中,语法如下:
server {
listen 80;
server_name example.com www.example.com;
# 其他配置
}
在这个例子中,Nginx 将对 example.com 和 www.example.com 的请求进行处理。
支持的模式
-
精确名称匹配:
- 直接指定完整的域名,如
example.com。 - 如果请求的主机名与配置的
server_name完全匹配,则该虚拟主机会被选择。
- 直接指定完整的域名,如
-
通配符名称匹配:
- 支持前缀和后缀通配符。
- 前缀通配符:
*.example.com匹配www.example.com、mail.example.com等。 - 后缀通配符:
example.*匹配example.com、example.net等。 - 通配符不能出现在中间,比如
www.*.com是无效的。
-
正则表达式匹配:
- 使用
~或~*前缀来指定正则表达式。 ~区分大小写,~*不区分大小写。- 例如:
这会匹配server_name ~^www\d+\.example\.com$;www1.example.com、www2.example.com等。
- 使用
优先级
Nginx 在匹配请求的主机名时,会按照以下优先级顺序进行:
- 精确名称:完全匹配的域名。
- 最长的通配符名称:最长的前缀或后缀通配符。
- 正则表达式:按配置顺序进行匹配。
- 默认服务器:如果没有其他匹配,则使用
listen指令中指定的默认服务器。
例子
server {
listen 80 default_server;
server_name _;
# 处理未匹配的请求
}
server {
listen 80;
server_name example.com www.example.com;
# 处理 example.com 和 www.example.com 的请求
}
server {
listen 80;
server_name *.example.org;
# 处理所有子域的 example.org 请求
}
server {
listen 80;
server_name ~^www\d+\.example\.net$;
# 处理 www1.example.net, www2.example.net 等请求
}
注意事项
server_name的值在域名解析时不区分大小写。- 配置多个
server_name时,使用空格分隔。 - 如果没有匹配到任何
server_name,请求会被路由到listen指令中标记为default_server的虚拟主机。
通过合理配置 server_name,可以在同一台服务器上托管多个网站或应用程序,并根据请求的域名将流量正确地路由到对应的虚拟主机。