Nginx 学习笔记(一)HTTP 核心配置指令
1.访问路由 location
1.1 URL 匹配规则
location 是 Nginx 对 HTTP 请求中的 URI 进行匹配处理的指令,
location 的语法形式如下:
location [=|~|~*|^~|@] pattern { ... }
其中, [=|~|~*|^~|@] 部分成为 location 修饰语(Modifier),修饰语定义了与 URI 的匹配方式。pattern 为匹配项,可以是字符串或者正则表达式。
无修饰语: 完全匹配 URI 中除访问参数以外的内容,匹配项的内容只能是字符串,不能是正则表达式。
修饰语"=": 完全匹配 URI 中除访问参数意外的内容。
修饰语"~": 完全匹配 URI 中除访问参数以外的内容。区分大小写。匹配项的内容必须是正则表达式。
修饰语"~*": 完全匹配 URI 中除访问参数以外的内容。不区分大小写。匹配项的内容必须是正则表达式。
修饰语"^~": 完全匹配 URI 中除访问参数以外的内容。匹配项的内容如果不是正则表达式,则不再进行正则表达式测试。
修饰语"@": 定义一个只能内部访问的 location 区域,可以被其他内部跳转指令使用,如 try_files 或 error_page。
1.2 匹配顺序
精确匹配
`=` 前缀指令匹配,如果匹配成功,则停止其他匹配
普通字符匹配
普通字符串指令匹配,顺序是从长到短,匹配成功的 location 如果使用^~,则停止其他匹配(正则匹配)
正则匹配
正则表达式指令匹配,按照配置文件里的顺序,成功就停止其他匹配
默认匹配
如果第三步中有匹配成功,则使用该结果,否则使用第二步结果
匹配模式和顺序
1.3 实验案例
测试"^~" 和 “~”,nginx 配置如下。浏览器输入 http://localhost/helloworld/test,返回 601。如将 #1 注释,#2 打开,浏览器输入 http://localhost/helloworld/test,返回 603。注:#1 和 #2 不能同时打开,如同时打开,启动 nginx 会报 nginx: [emerg] duplicate location “/helloworld”…,因为这两个都是普通字符串。
测试普通字符串的长短(普通字符串的匹配与顺序无关,与长短有关)。浏览器输入 http://localhost/helloworld/test/a.html,返回 601。浏览器输入 http://localhost/helloworld/a.html,返回 602。
测试正则表达式的顺序(正则匹配与顺序相关)。浏览器输入 http://localhost/helloworld/test/a.html,返回 602;将 #2 和 #3 调换顺序,浏览器输入 http://localhost/helloworld/test/a.html,返回 603
2 访问重写 rewrite
rewrite 访问重写是通过 rewrite 指令实现的,rewrite 指令的语法
格式如下:
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 数据处理
文件位置
root 指令: 跟目录指令。设定请求 URI 的本地文件根目录
当 root 指令在 location 指令域时,root 设置的是 location 匹配访问路径的上一层目录,样例中被请求文件的实际本地路径为/data/web/flv/。
location 中的路径是否带“/”,对本地路径的访问无任何影响。
alias 指令: 访问路径别名指令。默认情况下,本地文件的路径是 root 指令设定根目录的相对路径,通过 alias 指令可以将匹配的访问路径重新指定为新定义的文件路径。
可以用如下命令进行访问测试(查看 error.log 日志的报错信息确定访问的具体路径):
alias 指定的目录是 location 路径的实际目录。
其所在 location 的 rewrite 指令不能使用 break 参数。
try_files: 文件判断指令。用于顺序检查指定文件是否存在,如果不存在,则按照最后一个指定的 URI 做内部跳转。
评论