nginx 配置文件的匹配规则
引出
之前在对php-fpm
进行nginx
代理时, 为了对后台限定 IP 访问, 添加了如下配置:
location ^~ /admin {allow 127.0.0.1;deny all;
}
结果呢? 所有admin
路径下的php
文件, 全都没有解析, 变成文件下载了. 当时我不知道是什么问题, 不过将这段配置去掉之后, 问题就消失了. 所以, 我可以肯定的是, 一定是这段路径匹配的问题, 导致没有走php-fpm
的解析.
探究
为了探究原因, 我查找资料并做了尝试. 如果想直接看结果, 可以跳过这一 part.
在上方出现问题的场景中, nginx
的配置文件大体如下:
server {listen 80;server_name localhost;root /var/www/html;index index.php;location / {try_files $uri $uri/ /index.php?$args;}location ~ \.php$ {try_files $uri =404;//...此处省略 fpm 配置}location ^~ /admin {allow 127.0.0.1;deny all;}
}
经过思考, 当我访问localhost/admin/test.php
的时候, nginx
没有执行第二个匹配规则, 没有将文件交由php-fpm
解析器执行, 进而导致其作为静态文件直接下载.
接下来, 就是验证这个想法了. 最简单的验证方法, 就是在nginx
匹配规则中, 直接返回 HTTP 响应吗. 这样用curl
看一下响应码, 就知道执行了哪个规则了.
说干就干, 修改配置文件如下:
server {listen 80;server_name localhost;location / {return 300;}location ~ \.php$ {return 200;}location ^~ /admin {return 100;}
}
和猜想的一样, 即使匹配规则在前面, 但是仍然先匹配到了规则^~
. 也就是说规则 ^~
比规则 ~
的匹配优先级更高.
不过还有一点无法确定, 即使先匹配到了后面的规则, 那也不能说明前面的规则就不走了啊. nginx
也有可能是按照顺序依次进行匹配的.
为了验证, 我们将第三个配置规则中的return 100
删掉. 此时, 如果能够匹配到php
的规则, 那么就会返回响应码200, 如果不能, 应该提示找不到文件. 测试一下.
至此说明匹配到 ^~
规则的时候, 就会直接执行而不进行后续的匹配了. 那问了, 有可能是因为两个匹配规则的优先级不同, 故而忽略了优先级低的匹配规则.
为了验证nginx
对于相同优先级的匹配规则, 是否会进行后续匹配, 再次进行实验. 修改配置文件如下:
server {listen 80;server_name localhost;location ~ hp$ {return 400;}location ~ php$ {return 500;}
}
配置文件中两个正则匹配, 我的想法是这样的, 此时访问, 会返回响应吗 400, 说明匹配了第一个规则, 然后我将第一个规则中的return 400
删除, 如果返回了 500, 就说明nginx
在匹配了第一个规则之后, 继续执行了下一个匹配. 很严谨. 先访问一下:
很好, 符合预期, 然后将第一个规则中的return
删除, 再次访问:
这次返回了 404, 这说明, nginx
在执行到第一个匹配的时候, 就停止匹配, 不再进行后续匹配了.
至此, nginx
的匹配规则基本上已经复现出来了.
- 按照优先级从高到低的顺序进行匹配
- 相同优先级的, 按照配置文件中的顺序进行匹配
- 当匹配到一条规则之后, 停止后续匹配.
匹配规则
接下来整理一下nginx
路径的匹配规则, 以下优先级按照从高到底排序:
location = /xxx
: 路径精确匹配location ^~ /xxx
: 路径前缀匹配location ~ xxx
: 路径正则匹配location ~* xxx
: 路径正则匹配, 不区分大小写, 与正则匹配的优先级相同location /xxx
: 路径前缀匹配location /
: 通用匹配, 当其他都没有匹配的时候, 会走到这里.
nginx
会按照优先级从高到低依次进行匹配, 在第一个匹配成功的时候执行操作并停止匹配.
回顾
匹配规则看上去很简洁. 现在可以回头看一下我们最初遇到的问题了.
我们想让某后台地址限定 IP 访问, 故而添加了这样的配置:
location ~ \.php${//...
}
location ^~ /admin {allow 127.0.0.1;deny all;
}
现在应该很清楚了吧, 所有admin
下的路径, 因为规则^~
的优先级更高, 故而解析到了后面的规则, 而没有执行php
的解析操作. 又因为没有解析操作, 故而 php 文件都当做资源文件返回了.
那么问题来了, 如果我想对admin
路径下的路径执行访问限制, 改怎么办呢?
将规则
^~
改成~
? 不行, 因为优先级相同, 先匹配到前面的 php 正则匹配, 后面的限制没有效果将规则
^~
改成~
并提到前面? 不行, 因为优先级相同, 先匹配到限制, 如果通过不会进行后面的 php 解析.
这不陷入死循环了么? 我又想对某个路径执行限制, 如果限制通过的话, 又需要能够正常解析. 怎么破? 这里我探索出来的思路是, 他不是不认识php
文件么, 我让他认识认识不就完了么. 直接将匹配的解析过程嵌套写入, 配置文件大体如下:
location ^~ /admin{deny all;location ~ \.php$ {//...}}
这样的话, 就可以达到在执行 IP 限制的前提下, 又能够正常解析php-fpm
.
那么一个新的问题来了, 这不就相当于将 php 的解析复制了一遍么? 也太不优雅了. 我想到的方案是, 通过nginx
的include
命令. 通过将php
文件的解析配置单独放到一个配置文件php-fpm.conf.common
文件中, 内容如下:
location ~ \.php${// ...
}
这样, 原本的配置文件就可以改写成如下形式了:
location ^~ /admin {allow 127.0.0.1;deny all;# 这里因为相对路径使用的是 nginx.conf 的路径, 所以需要再走一层include ./conf.d/php-fpm.conf.comon
}
include ./conf.d/php-fpm.conf.common
此时, 就能够实现之前的目的了, admin
路径下的php
文件仅对指定 ip 开放, 且通过时能够正常进行解析.
有可能有更优雅的解决方案, 我看网上有些实现是通过rewrite
的方式来实现的, 但是我试了很多次都没有成功. 如果你有更好的方式, 还望不吝赐教.
经过几天的实验, 终于把nginx
的执行顺序搞懂了, 感谢我的中学老师会了我控制变量法.
nginx 配置文件的匹配规则相关推荐
- nginx之location匹配规则
Nginx之location 匹配规则详解 有些童鞋的误区 1. location 的匹配顺序是"先匹配正则,再匹配普通". 矫正: location 的匹配顺序其实是" ...
- Nginx之location 匹配规则详解
Nginx 的语法形式是: location [=|~|~*|^~|@] /uri/ { - } ,意思是可以以" = "或" ~* "或" ~ &q ...
- Nginx的基本匹配规则与配置.m3u8视频源
目录 第一章 配置视频源 第二章 nginx的基本匹配规则 2.1 修改用户 2.2 匹配规则 第一章 配置视频源 我在网上看到许多需要装rmtp模块什么的,但是我把nginx下载下来再把.m3u8视 ...
- nginx的优先匹配规则
nginx的优先匹配规则 以=开头表示精确匹配 如 A 中只匹配根目录结尾的请求,后面不能带任何字符串. ^~ 开头表示uri以某个常规字符串开头,不是正则匹配 ~ 开头表示区分大小写的正则匹配; ~ ...
- nginx中location匹配规则与proxy_pass代理转发
最近使用nginx在服务器上配置,在做路径匹配时上遇到细节上的东西,在此做记录,安装请转 windows下安装使用nginx教程 一.location匹配规则 1.前缀匹配:不带符号 server { ...
- linux 路由匹配原则,Nginx localhost路由匹配规则
URI 即统一标识资源符,通用的 URI 语法格式如下: scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment] 格式说明 ...
- ngix 常用配置之 location 匹配规则
大家好,我是 17. 今天和大家详细聊聊 nginx 的 location 匹配规则 location 匹配规则 @ 匹配规则在后面的 try_files 中有举例 location 按如下优先级匹配 ...
- nginx匹配规则_Nginx系列之server_name定义与匹配规则
Nginx系列之server_name定义与匹配规则 server_name用来指定请求中的Host头部,在上一节的基于域名的虚拟机中,nginx匹配的规则就是根据server_name的不同,结合请 ...
- nginx配置中location匹配规则详解
女主宣言 nginx作为一款性能优异的反向代理服务器,可以用于静态代理.负载均衡.限流等多种场景.那么,要灵活的使用nginx,必须清楚nginx配置文件的使用.本文作者对nginx的http块中的l ...
最新文章
- 输入n个字符串字典序排序_FSST - 快速字符串压缩算法
- Centos 7 下 Corosync + Pacemaker + DRBD + psc + crmsh 实现 mysql 服务高可用
- Aiiage Camp Day5 A Rikka with Linker
- [STL][C++]STACK QUEUE
- 【机器视觉】 HDevelop语言基础(五)-多线程
- 排序千万级数据_从千万级房产成交量排名,窥探中国城市的真实家底
- ubuntu下使用python将ppt转成图片_Ubuntu下使用Python实现游戏制作中的切分图片功能...
- python中pillow库教程_Python图像处理库:Pillow 初级教程
- Python判断是否json是否包含一个key
- SSLH:让 HTTPS 和 SSH 共享同一个端口
- html底部线条,这种APP底部横线+文字该怎么布局?css
- zynq pl 发数据给 ps
- 元宇宙来袭的五个趋势
- LeCo-81.搜索旋转数组(二)
- linux 添加快捷命令,linux 添加快捷指令
- Source Insight 4.0首次安装提示unable to open or create...解决方案
- 比特彗星一直显示连接服务器,BitComet常见问题
- MATLAB快速获取二维图像/矩阵最大值和位置
- 解决屏蔽流氓蜘蛛抓取,如MJ12bot 、DotBot 、BLEXBot 、PetalBot 、DataForSeoBot
- xpath解析爬虫爬取豆瓣图书Top250的数据
热门文章
- PID控制器改进笔记之五:改进PID控制器之串级设定
- 使用Eclipse进行Makefile项目
- wxPython做界面的适用性
- mysql8.0 线上线下数据库版本不一致导致的问题
- [错误记录] --- rocketmq批量消费设置参数的问题
- 云计算的发展趋势_2020年的云计算发展趋势预测
- python 二分法调试代码,Python实现二分法
- python高阶函数、map reduce 自己如何去定义_小猿圈python之高阶函数lambda、map和reduce用法...
- a股历史30年的大盘价_2020年7月30日大盘走势分析
- python设计模式免费_python 设计模式