nginx
在收到一条请求时将先经过 server_name
匹配一个 server
, 而后使用 server
中的 location
继续匹配.html
server_name
在 nginx
中, server_name
决定了当收到一个请求后哪个 server
会被使用. nginx
会使用请求头中的 Host
字段与 server_name
进行匹配. 定义 server_name
时可使用 彻底名称
、通配符名称
、正则表达式名称
, 它们的匹配顺序以下:nginx
*.example.org
mail.*
若是没有匹配到结果, 将会使用 default_server
进行处理, 若是没有定义, 则第一个定义的为 default_server
. 使用三个简单的 server
做为例子, 让他们监听 80
端口, server_name
分别设置为 *.org
、*.net
、*.com
:正则表达式
server {
listen 80;
server_name example.org www.example.org;
return 401;
}
server {
listen 80;
server_name example.net www.example.net;
return 402;
}
server {
listen 80;
server_name example.com www.example.com;
return 403;
}
复制代码
在上面的配置中, 默认的服务器为 第一个
, 随便访问一个不存在的 server
将会返回 401
. 不过可使用 default_server
手动设置一个默认主机, default_server
设置在 listen
字段, 以下:api
server {
listen 80 default_server;
server_name example.net www.example.net;
}
复制代码
以后再匹配时, 未匹配到将会使用这个 server
.浏览器
若是想要禁止一个没有携带 Host
字段的请求, 能够定义以下 server
:bash
server {
listen 80;
server_name "";
return 444;
}
复制代码
server_name
定义为空字符串, 若是 Host
字段为空或不存在, 将会匹配到这个 server
, 而后返回 404
状态码.服务器
Nginx
的444
状态比较特殊,若是返回444
那么客户端将不会收到服务端返回的信息,就像是网站没法链接同样, 浏览器直接显示502
. 可是若是使用反向代理, 仍是显示正常状态码网站
若是想要禁止访问不存在的主机, 能够这样定义:ui
server {
listen 80 default_server;
server_name _;
return 444;
}
复制代码
_
在这里没有任何特别含义, 由于一个域名中不会出现 _
, 因此不会与任何真实的域名相同, 使用其余非法字符是相同的道理.spa
IP
和 server_name
如今来看一下对于监听不一样 IP
和不一样 server_name
混合使用时是如何处理的:
server {
listen 192.168.1.1:80;
server_name example.org www.example.org;
}
server {
listen 192.168.1.1:80;
server_name example.net www.example.net;
}
server {
listen 192.168.1.2:80;
server_name example.com www.example.com;
}
复制代码
在这个配置中, nginx
首先匹配 IP
, 匹配到后再匹配它们的 server_name
, 若是没有匹配到 server_name
, 则使用到它们默认的 server
. 举个例子, 若是一个域名为 www.example.com
的请求来自 192.168.1.1:80
. 可是监听 192.168.1.1:80
的 server
只有两个, 这两个都不能匹配 www.example.com
, 那么就使用这两个 server
中的默认主机, 因为没有使用 defualt_server
定义监听, 因此默认为第一个即 www.example.org
这个 server
. 固然你能够定义 defualt_server
:
server {
listen 192.168.1.1:80;
server_name example.org www.example.org;
}
server {
listen 192.168.1.1:80 default_server;
server_name example.net www.example.net;
}
server {
listen 192.168.1.2:80 default_server;
server_name example.com www.example.com;
}
复制代码
location
在 nginx
匹配到一个 server
后, 就会经过 location
继续处理请求, 下面是一个示例:
server {
listen 172.17.0.3:80;
server_name _;
location / {
return 401;
}
location ~*\.(gif|jpg|png)$ {
return 402;
}
location ~*\.(gif|jpg|png)$ {
return 404;
}
location /api {
return 403;
}
}
复制代码
nginx
首先会在全部的 location
中搜索 前缀
进行匹配, 匹配到前缀后, 将按顺序匹配使用 正则表达式
定义的 location
, 匹配到就结束, 若是没有匹配到, 则使用以前匹配到前缀的那个 location
进行处理, 下面是具体匹配的例子:
/x.gif
请求, 首先匹配到的前缀为 /
, 而后使用剩下的 x.gif
跟 location
的正则去匹配, 先匹配到了 location ~*\.(gif|jpg|png)$
, 返回 402
./x.pdf
请求, 因为 x.pdf
没法被匹配到, 因此使用 location /
进行处理./api/x.gif
, 首先匹配到前缀为 /api
, 而后使用剩下的 x.gif
跟 location
的正则去匹配, 先匹配到了 location ~*\.(gif|jpg|png)$
, 返回 402
./api/x.pdf
请求, 因为 x.pdf
没法被匹配到, 因此使用 location /api
进行处理.