语法规则
location [=|~|~*|^~] /uri/ { … }
规则 | 作用 |
---|---|
= /uri | 表示精确匹配,只有完全匹配上才能生效 |
^~ /uri | 对URL路径进行前缀匹配,并且在正则之前 |
~ pattern | 表示区分大小写的正则匹配 |
~* pattern | 表示不区分大小写的正则匹配 |
/uri | 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后 |
/ | 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default |
前缀匹配时,Nginx 不对 url 做编码,因此请求为 /static/20%/aa,可以被规则 ^~ /static/ /aa 匹配到(注意是空格)
匹配顺序
- 首先精确匹配 =
- 其次前缀匹配 ^~
- 其次是按文件中顺序的正则匹配
- 然后匹配不带任何修饰的前缀匹配
- 最后是交给 / 通用匹配
当有匹配成功时候,停止匹配,按当前匹配规则处理请求
注意:前缀匹配,如果有包含关系时,按最大匹配原则进行匹配。比如在前缀匹配 location /dir01 与 location /dir01/dir02,如有请求 http://localhost/dir01/dir02/file 将最终匹配到 location /dir01/dir02
匹配举例
示例1:路径匹配
匹配规则如下
1 | location = / { |
访问路径 | 示例路径 | 匹配规则 | 说明 |
---|---|---|---|
/ | localhost | 规则A | |
/login | localhost/login | 规则B | |
/static/a.html | localhost/static/a.html | 规则C | |
/static/files/a.exe | localhost/static/files/a.exe | 规则X | 虽然 规则C 也能匹配到,但因为最大匹配原则,最终选中了 规则X |
/a.gif | localhost/a.gif | 规则D | |
/a.PNG | localhost/a.PNG | 规则E | 规则E 不区分大小写 |
/b.png | localhost/b.png | 规则D | 规则D 顺序优先,规则E 不起作用 |
/static/c.png | localhost/static/c.png | 规则C | 优先匹配到 规则C |
/img/a.gif | localhost/img/a.gif | 规则D | 规则Y 也可以匹配上,但是因为正则匹配优先,而忽略了规则Y |
/img/a.tiff | localhost/img/a.tiff | 规则Y | |
/register | localhost/register | 规则F | |
/category/id/1111 | localhost/category/id/1111 | 规则F |
示例2:常用匹配规则
nginx 作为 http 服务器的强项
方式一:目录匹配1
2
3location ^~ /static/ {
root /webroot/static/;
}
方式二:后缀匹配1
2
3location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
转发动态请求到后端应用服务器
1 | location / { |
直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理。这里是直接转发给后端应用服务器了,也可以是一个静态首页
1 | location = / { |
403 Forbidden
检查步骤
关闭SELinux
- 查看状态 sestatus –v
- 临时关闭 setenforce 0 (需要root身份),修改为permissive模式
检查用户权限, 确认配置文件里面的user是否有权限访问路径
- 修改目录权限
- 修改目录所属用户
- 修改目录权限
- 确认文件存在
uri末尾 / 作用
反向代理
测试路径:http://localhost/proxy/test.html
1 | location /proxy/ { |
实际访问路径为 http://127.0.0.1:8000/test.html
如果去掉末尾 /
1 | location /proxy { |
实际访问路径为 http://127.0.0.1:8000/proxy/test.html
代理地址不包含 /
1 | location /proxy/ { |
实际访问路径:http://127.0.0.1:8000/proxy/api/test.html
代理地址包含 /
1 | location /proxy/ { |