Nginx配置之location

自古美人都是妖i 提交于 2020-01-15 17:03:47

Nginx的配置

nginx配置主要就是配置三个区段:http,server,location

http没什么好说的,server也没什么好说的主要就是location

location通过指定的模式与客户端请求的URI来匹配,模式类似正则表达式,当然也支持正则表达式,基本语法:

location [=||*|^~|@] pattern{……}

这个[]里面可以写参数也可以不写参数,所以大概有这么几种情况

location = pattern{} #精准匹配
location pattern{}#一般匹配
location ~ pattern{}#正则匹配

精准匹配

先来说精准匹配,顾名思义就是说location后面的pattern被限制为一个固定的串,所以请求的URI必须和这个pattern一致

server{
    server_name localhost;
    location = /aaa{
        [...]
    }
}
#http://localhost/abc   匹配
#http://localhost/ABC   忽略大小写就匹配,比如windows
#http://localhost/abc?paraml 忽略查询参数也匹配,其它的就不匹配了

这时候请求的URI就固定为/abc了比如:http://localhost/abc

一般匹配

一般匹配,这种模式就是左前缀匹配,就是说以pattern开头的匹配

server{
    server_name localhost;
    location  /aaa{
        [...]
    }
}

#http://localhost/abc   匹配
#http://localhost/ABC   忽略大小写就匹配,比如windows
#http://localhost/abc?paraml 忽略查询参数也匹配,其它的就不匹配了
#http://localhost/abcdefg 匹配,也就是说只要前缀匹配就行

正则匹配 ~

这时候pattern必须是正则表达式,注意正则不只一种,这是第一种

server {
    server_name localhost;
    location ~ ^/abcd$ {
    […]
    }
}


http://localhost/abcd        # 完全匹配

http://localhost/ABCD        # 不匹配,~ 对大小写是敏感的

http://localhost/abcd?param1     # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1 

http://localhost/abcd/    # 不匹配,因为末尾存在反斜杠(trailing slash),并不匹配正则表达式 ^/abcd$

http://localhost/abcde    # 不匹配正则表达式 ^/abcd$

正则匹配~*

这种匹配就不区分大小写了,pattern是正则表达式,比起第一种就是忽略大小写

server {
    server_name localhost;
    location ~ ^/abcd$ {
    […]
    }
}


http://localhost/abcd        # 完全匹配

http://localhost/ABCD        # 匹配,~* 对大小写是不敏感的

http://localhost/abcd?param1     # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1 

http://localhost/abcd/    # 不匹配,因为末尾存在反斜杠(trailing slash),并不匹配正则表达式 ^/abcd$

http://localhost/abcde    # 不匹配正则表达式 ^/abcd$

正则匹配 ^~ ,!和!*,

这三种分别是这样的

  • ^~ 和一般模式一样,只是pattern是正则表达式
  • !区分大小写,!*不区分大小写

通用匹配/

这个会匹配任意的请求

特殊匹配@

定义一个只能被nginx内部访问的块,不能被外部请求到

匹配的优先级

比如当有两个以上的location时去匹配谁呢,这时候就需要根据优先级来判断了。

1:带有“=“的精确匹配优先

2:没有修饰符的精确匹配

3:正则表达式按照他们在配置文件中定义的顺序

4:带有“^~”修饰符的,开头匹配

5:带有“~” 或“~*” 修饰符的,如果正则表达式与URI匹配

6:没有修饰符的,如果指定字符串与URI开头匹配

示例:

location =/ {} #只匹配/的请求
location / {} #匹配任意请求,优先级低于正则表达式和其它的模式
location ^~ /images/ {} #匹配images下的文件
location ~* \.(gif|jpg|jpeg)$ {} #不区分大小写的匹配以这几种图片格式结尾的请求

root和alias指令

location /img/ {
    alias /images/;
}

这种做法就是访问/images/下面的文件,也就是说/img/是一个别名,而且alias末尾必须加上/。

location /img/ {
    root /usr/local/images;
}

root就代表指定了一个根目录,会和请求的目录拼成一个目录/usr/local/images/img/,后面的/可有可无。

最后贴一个必须的location

#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说.
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
    proxy_pass http://127.0.0.1:88; #代理
}

# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
    expires      30d;
}

location ~ .*\.(js|css)?$
{
    expires      12h;
}

location ~ /\.  
{
    deny all; # 其他的任意后缀都不让其访问;
}

#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
location /
{
    try_files $uri @apache; #try_files 将尝试你列出的文件并设置内部文件指向
}

location @apache
{
    internal; # internal指令指定某个location只能被“内部的”请求调用,外部的调用请求会返回”Not found”
    proxy_pass http://127.0.0.1:88;
    
    proxy_connect_timeout 300s;
    proxy_send_timeout   900;
    proxy_read_timeout   900;
    proxy_buffer_size    32k;
    proxy_buffers     4 32k;
    proxy_busy_buffers_size 64k;
    proxy_redirect     off;
    proxy_hide_header  Vary;
    proxy_set_header   Accept-Encoding '';
    proxy_set_header   Host   $host;
    proxy_set_header   Referer $http_referer;
    proxy_set_header   Cookie $http_cookie;
    proxy_set_header   X-Real-IP  $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!