写点什么

Nginx 学习笔记(一)HTTP 核心配置指令

作者:Starry
  • 2022-12-23
    北京
  • 本文字数:2649 字

    阅读完需:约 9 分钟

1.访问路由 location

1.1 URL 匹配规则

location 是 Nginx 对 HTTP 请求中的 URI 进行匹配处理的指令,

location 的语法形式如下:

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


其中, [=|~|~*|^~|@] 部分成为 location 修饰语(Modifier),修饰语定义了与 URI 的匹配方式。pattern 为匹配项,可以是字符串或者正则表达式。

无修饰语: 完全匹配 URI 中除访问参数以外的内容,匹配项的内容只能是字符串,不能是正则表达式。

location /images { root /data/web;}
复制代码

修饰语"=": 完全匹配 URI 中除访问参数意外的内容。

location = /images { root /data/web;}
复制代码


修饰语"~": 完全匹配 URI 中除访问参数以外的内容。区分大小写。匹配项的内容必须是正则表达式。

location ~ /images/.*\.(gif|jpg|png)$ { root /data/web;}
复制代码

修饰语"~*": 完全匹配 URI 中除访问参数以外的内容。不区分大小写。匹配项的内容必须是正则表达式。

location ~* \.(gif|jpg|png)$ { root /data/web;}
复制代码


修饰语"^~": 完全匹配 URI 中除访问参数以外的内容。匹配项的内容如果不是正则表达式,则不再进行正则表达式测试。

location ^~ /images { root /data/web;}
复制代码

修饰语"@": 定义一个只能内部访问的 location 区域,可以被其他内部跳转指令使用,如 try_files 或 error_page。

location @images {  proxy_pass http://images; }
复制代码

1.2 匹配顺序

  1. 精确匹配

`=` 前缀指令匹配,如果匹配成功,则停止其他匹配

  1. 普通字符匹配

普通字符串指令匹配,顺序是从长到短,匹配成功的 location 如果使用^~,则停止其他匹配(正则匹配)

  1. 正则匹配

正则表达式指令匹配,按照配置文件里的顺序,成功就停止其他匹配

  1. 默认匹配

如果第三步中有匹配成功,则使用该结果,否则使用第二步结果


匹配模式和顺序

location = /uri    =开头表示精确匹配,只有完全匹配上才能生效。location ^~ /uri   ^~ 开头对URL路径进行前缀匹配,并且在正则之前。location ~ pattern  ~开头表示区分大小写的正则匹配。location ~* pattern  ~*开头表示不区分大小写的正则匹配。location /uri     不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。location /      通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。
复制代码

1.3 实验案例

测试"^~" 和 “~”,nginx 配置如下。浏览器输入 http://localhost/helloworld/test,返回 601。如将 #1 注释,#2 打开,浏览器输入 http://localhost/helloworld/test,返回 603。注:#1 和 #2 不能同时打开,如同时打开,启动 nginx 会报 nginx: [emerg] duplicate location “/helloworld”…,因为这两个都是普通字符串。

location ^~ /helloworld { #1 	return 601;} #location /helloworld { #2 # 	return 602;#} location ~ /helloworld {  		return 603;  }
复制代码


测试普通字符串的长短(普通字符串的匹配与顺序无关,与长短有关)。浏览器输入 http://localhost/helloworld/test/a.html,返回 601。浏览器输入 http://localhost/helloworld/a.html,返回 602。

location /helloworld/test/ {        #1    return 601;}        location /helloworld/ {                #2    return 602;}
复制代码


测试正则表达式的顺序(正则匹配与顺序相关)。浏览器输入 http://localhost/helloworld/test/a.html,返回 602;将 #2 和 #3 调换顺序,浏览器输入 http://localhost/helloworld/test/a.html,返回 603

location /helloworld/test/ { #1return 601;}
location ~ /helloworld { #2return 602;}
location ~ /helloworld/test { #3return 603;}
复制代码

2 访问重写 rewrite

rewrite 访问重写是通过 rewrite 指令实现的,rewrite 指令的语法

格式如下:

rewrite regex replacement [flag];
复制代码

1)regex 是 PCRE 语法格式的正则表达式。

2)replacement 是重写 URI 的改写规则。当改写规则以“http://”“https://”或“$scheme”开头时,Nginx 重写该语句后将停止执行后续任务,并将改写后的 URI 跳转返回客户端。

3)flag 是执行该条重写指令后的操作控制符。操作控制符有如下 4 种:

  • last:执行完当前重写规则跳转到新的 URI 后继续执行后续操作

  • break:执行完当前重写规则跳转到新的 URI 后不再执行后续操作。不影响用户浏览器 URI 显示。

  • redirect:返回响应状态码 302 的临时重定向,返回内容是重定向 URI 的内容,但浏览器网址仍为请求时的 URI。

  • permanent:返回响应状态码 301 的永久重定向,返回内容是重定向 URI 的内容,浏览器网址变为重定向的 URI。


3 数据处理

  1. 文件位置

root 指令: 跟目录指令。设定请求 URI 的本地文件根目录

location /flv/ { root /data/web;}
复制代码

当 root 指令在 location 指令域时,root 设置的是 location 匹配访问路径的上一层目录,样例中被请求文件的实际本地路径为/data/web/flv/。

location 中的路径是否带“/”,对本地路径的访问无任何影响。


alias 指令: 访问路径别名指令。默认情况下,本地文件的路径是 root 指令设定根目录的相对路径,通过 alias 指令可以将匹配的访问路径重新指定为新定义的文件路径。

 listen 8080; server_name www.nginxtest.org; root /opt/nginx-web/www; location /flv/ { alias /opt/nginx-web/flv/; } location /js { alias /opt/nginx-web/js; } location /img { alias /opt/nginx-web/img/; }}
复制代码


可以用如下命令进行访问测试(查看 error.log 日志的报错信息确定访问的具体路径):

curl http://127.0.0.1:8080/flv/   访问/opt/nginx-web/flv/index.htmlcurl -L http://127.0.0.1:8080/js   访问/opt/nginx-web/jscurl http://127.0.0.1:8080/js/   访问/opt/nginx-web/js/index.htmlcurl -L http://127.0.0.1:8080/img   访问/opt/nginx-web/img/curl http://127.0.0.1:8080/img/   访问/opt/nginx-web/img//index.htmlcurl http://127.0.0.1:8080/js1   访问/opt/nginx-web/js1curl http://127.0.0.1:8080/img1   访问/opt/nginx-web/img/1curl http://127.0.0.1:8080/abc   访问/opt/nginx-web/www/abccurl http://127.0.0.1:8080/abc/   访问/opt/nginx-web/www/abc/index.htmlcurl http://127.0.0.1:8080/flv   访问/opt/nginx-web/www/flv
复制代码


alias 指定的目录是 location 路径的实际目录。

其所在 location 的 rewrite 指令不能使用 break 参数。


try_files: 文件判断指令。用于顺序检查指定文件是否存在,如果不存在,则按照最后一个指定的 URI 做内部跳转。

location /images/ { # $uri存在则执行代理的上游服务器操作,否则跳转到default.gif的location try_files $uri /images/default.gif;}location = /images/default.gif { expires 30s;}
复制代码


用户头像

Starry

关注

还未添加个人签名 2018-12-10 加入

还未添加个人简介

评论

发布
暂无评论
Nginx学习笔记(一)HTTP核心配置指令_Starry_InfoQ写作社区