Nginx Location 基本配置
基本语法格式:
Location block 的基本语法形式是: location [=|~|~*|^~|@] pattern { ... } [=|~|~*|^~|@] 被称作 location modifier ,这会定义 Nginx 如何去匹配其后的 pattern ,以及该 pattern 的最基本的属性(简单字符串或正则表达式)
location 的匹配符
1.等于匹配符:=
等于匹配符就是等号,特点可以概括为两点:
精确匹配,优先级最高,匹配成功后则停止向下搜索
不支持正则表达式
server { server_name website.com; location = /abcd { […] } } 匹配情况: http://website.com/abcd # 正好完全匹配 http://website.com/ABCD # 如果运行 Nginx server 的系统本身对大小写不敏感,比如 Windows ,那么也匹配 http://website.com/abcd?param1m2 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1m2 http://website.com/abcd/ # 不匹配,因为末尾存在反斜杠(trailing slash),Nginx 不认为这种情况是完全匹配 http://website.com/abcde # 不匹配,因为不是完全匹配
2.空匹配符
空匹配符的特点是:
匹配以指定模式开始的 URI,区分大小写,字符串匹配
不支持正则表达式
# 可以不写 location modifier ,Nginx 仍然能去匹配 pattern 。这种情况下,匹配那些以指定的 patern 开头的 URI,注意这里的 URI 只能是普通字符串,不能使用正则表达式。 server { server_name website.com; location /abcd { […] } } 匹配情况: http://website.com/abcd # 正好完全匹配 http://website.com/ABCD # 如果运行 Nginx server 的系统本身对大小写不敏感,比如 Windows ,那么也匹配 http://website.com/abcd?param1m2 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1m2 http://website.com/abcd/ # 末尾存在反斜杠(trailing slash)也属于匹配范围内 http://website.com/abcde # 仍然匹配,因为 URI 是以 pattern 开头的
3.正则匹配符:~ 和 ~*
正则匹配符是可以使用正则表达式的匹配符。不过这里要强调的是,一般来说~是指:
区分大小写的正则匹配
但是对于一些对大小写不敏感的操作系统,这两者没有区别。另外一个就是^~,其表示以指定模式开始的正则匹配。
# 这个 location modifier 对大小写敏感,且 pattern 须是正则表达式 server { server_name website.com; location ~ ^/abcd$ { […] } } 匹配情况: http://website.com/abcd # 完全匹配 http://website.com/ABCD # 不匹配,~ 对大小写是敏感的 http://website.com/abcd?param1m2 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1m2 http://website.com/abcd/ # 不匹配,因为末尾存在反斜杠(trailing slash),并不匹配正则表达式 ^/abcd$ http://website.com/abcde # 不匹配正则表达式 ^/abcd$ # 注意:对于一些对大小写不敏感的系统,比如 Windows ,~ 和 ~* 都是不起作用的,这主要是操作系统的原因。
~* 表示:不区分大小写的正则匹配
server { server_name website.com; location ~* ^/abcd$ { […] } } 匹配情况: http://website.com/abcd # 完全匹配 http://website.com/ABCD # 匹配,这就是它不区分大小写的特性 http://website.com/abcd?param1m2 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1m2 http://website.com/abcd/ # 不匹配,因为末尾存在反斜杠(trailing slash),并不匹配正则表达式 ^/abcd$ http://website.com/abcde # 不匹配正则表达式 ^/abcd$
4. ^~
匹配情况类似 2. (空字符) 的情况,以指定匹配模式开头的 URI 被匹配,不同的是,一旦匹配成功,那么 Nginx 就停止去寻找其他的 Location 块进行匹配了(与 Location 匹配顺序有关)
5. 内部访问符:@
用于定义一个 Location 块,且该块不能被外部 Client 所访问,只能被 Nginx 内部配置指令所访问,比如 try_files or error_page。一般用于错误页面等。
匹配符优先级
Location匹配规则
语法规则: 【= | ^~ | ~ | ~* | / | /uri 】
location = /uri = 表示精确匹配,只有完全匹配上才能生效,若找到,停止搜索; location ^~ /uri ^~开头表示对URL路径进行前缀匹配,并且在正则匹配之前,若找到,停止搜索; location ~ pattern ~开头表示区分大小写的正则匹配,按配置文件顺序匹配; location ~* pattern ~*开头表示不区分大小写的正则匹配,按配置文件顺序匹配; location !~和!~* 分别为区分大小写不匹配及不区分大小写不匹配 的正则 location /uri 不带任何修饰符,表示前缀匹配,在正则匹配之后; location / 通用匹配,任何未匹配到其他location的请求都会匹配到,相当于default;
多个location配置的情况匹配顺序为
首先精确匹配 = ; 其次前缀匹配 ^~; 其次是按照配置文件中的正则匹配; 然后匹配不带任何修饰符的前缀匹配; 最后交给/通用匹配
案例
location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 # 但是正则和最长字符串会优先匹配 [ configuration B ] } location /documents/ { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration C ] } location ~ /documents/Abc { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration CC ] } location ^~ /images/ { # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。 [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 gif,jpg或jpeg 结尾的请求 # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则 [ configuration E ] } location /images/ { # 字符匹配到 /images/,继续往下,会发现 ^~ 存在 [ configuration F ] } location /images/abc { # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在 # F与G的放置顺序是没有关系的 [ configuration G ] } location ~ /images/abc/ { # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用 [ configuration H ] } location ~* /js/.*/\.js
每天记录一点,就能多学一点,充实一点