Nginx处理HTTP请求的路由过程

来源:互联网 发布:在哪里注册开淘宝店 编辑:程序博客网 时间:2024/05/18 03:41

选择server

Nginx的Worker进程首先获取HTTP请求的目的IP地址和端口号,然后扫描所有server配置,根据IP地址和端口号找到对应的server列表。接着Nginx根据请求的Host头字段和server的server_name(可以包括IP地址,比如192.168.0.6)匹配情况决定选择哪个server,选择的优先级如下:

1.完全匹配。

2.最长前缀匹配。

3.最长后缀匹配。

4.按配置顺序出现的第一个正则表达式匹配。

5.listen指令配置有default_server参数的server。

6.按配置顺序出现的第一个server。

使用下面的配置可以丢弃缺乏Host头的请求:

server {
    listen      80;
    server_name "";  //可以省略,因为server_name默认就是""
    return      444;
}

Server names

通配符

通配符必须以"*"开头,或者以"*"结尾,而且前面或后面只能是".",比如*.example.com或者www.example.*。".example.com"表示example.com||*.example.com。

正则表达式

正则表达式以~开始,如果正则表达式中含有"{"或者"}",则必须加上引号:
server_name  "~^(?<name>\w\d{1,3}+)\.example\.net$";
正则表达式中可以使用命名捕获组:
server {
    server_name   ~^(www\.)?(?<domain>.+)$;
    location / {
        root   /sites/$domain;
    }
}
server_name不支持匹配所有的名称(比如"*"),要实现该功能,可以使用server_name_in_redirect指令。

选择location

location [=|~|~*|^~] /uri/ {...}

location @name {...}

匹配规则如下:

1.如果存在=/uri/匹配该URI,则停止搜索并作为最佳匹配。

2.找到所有剩下的常规匹配中的最长匹配,如果该匹配使用^~前缀,就停止搜索并作为最佳匹配。

3.找到第一个匹配的正则表达式,如果存在,则停止搜索并使用该正则表达式作为最佳匹配。

4.如果3不存在,则使用2中找到的最长匹配。


注意:为了避免找不到匹配的location,可以在最后使用location / {...}匹配所有的URI。


0 0
原创粉丝点击