【Nginx 】nginx的正则表达式

2023-11-03

1、nginx配置基础

1、正则表达式匹配

~ 区分大小写匹配

~* 不区分大小写匹配

!~和!~*分别为区分大小写不匹配及不区分大小写不匹配

^ 以什么开头的匹配

$ 以什么结尾的匹配

转义字符。可以转. * ?等

* 代表任意字符

2、文件及目录匹配

-f和!-f用来判断是否存在文件

-d和!-d用来判断是否存在目录

-e和!-e用来判断是否存在文件或目录

-x和!-x用来判断文件是否可执行

例:

location = /

#匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配

location ^~ /images/ {

# 匹配任何已/images/开头的任何查询并且停止搜索。任何正则表达式将不会被测试。

location ~* .(gif|jpg|jpeg)$ {

# 匹配任何已.gif、.jpg 或 .jpeg 结尾的请求

入门

1、if指令

所有的Nginx内置变量都可以通过if指令和正则表达式来进行匹配,并且根据匹配结果进行一些操作,如下:

代码如下

复制代码

if ($http_user_agent ~ MSIE) {

rewrite ^(.*)$ /msie/$1 break;

}

if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {

set $id $1;

}

使用符号~*和~模式匹配的正则表达式:

1.~为区分大小写的匹配。

2.~*不区分大小写的匹配(匹配firefox的正则同时匹配FireFox)。

3.!~和!~*意为“不匹配的”。

Nginx在很多模块中都有内置的变量,常用的内置变量在HTTP核心模块中,这些变量都可以使用正则表达式进行匹配。

2、可以通过正则表达式匹配的指令

location

查看维基:location

可能这个指令是我们平时使用正则匹配用的最多的指令:

代码如下

复制代码

location ~ .*.php?$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /data/wwwsite/test.com/$fastcgi_script_name;

include fcgi.conf;

}

几乎每个基于LEMP的主机都会有如上一段代码。他的匹配规则类似于if指令,不过他多了三个标识符,^~、=、@。并

且它没有取反运算符!,这三个标识符的作用分别是:

1.^~ 标识符后面跟一个字符串。Nginx将在这个字符串匹配后停止进行正则表达式的匹配(location指令中正则表达

式的匹配的结果优先使用),如:location ^~ /images/,你希望对/images/这个目录进行一些特别的操作,如增加

expires头,防盗链等,但是你又想把除了这个目录的图片外的所有图片只进行增加expires头的操作,这个操作可能

会用到另外一个location,例如:location ~* .(gif|jpg|jpeg)$,这样,如果有请求/images/1.jpg,nginx如何决

定去进行哪个location中的操作呢?结果取决于标识符^~,如果你这样写:location /images/,这样nginx会将1.jpg

匹配到location ~* .(gif|jpg|jpeg)$这个location中,这并不是你需要的结果,而增加了^~这个标识符后,它在匹

配了/images/这个字符串后就停止搜索其它带正则的location。

2.= 表示精确的查找地址,如location = /它只会匹配uri为/的请求,如果请求为/index.html,将查找另外的

location,而不会匹配这个,当然可以写两个location,location = /和location /,这样/index.html将匹配到后者

,如果你的站点对/的请求量较大,可以使用这个方法来加快请求的响应速度。

3.@ 表示为一个location进行命名,即自定义一个location,这个location不能被外界所访问,只能用于Nginx产生的

子请求,主要为error_page和try_files。

注意,这3个标识符后面不能跟正则表达式,虽然配置文件检查会通过,而且没有任何警告,但是他们并不会进行匹配

综上所述,location指令对于后面值的匹配顺序为:

1.标识符“=”的location会最先进行匹配,如果请求uri匹配这个location,将对请求使用这个location的配置。

2.进行字符串匹配,如果匹配到的location有^~这个标识符,匹配停止返回这个location的配置。

3.按照配置文件中定义的顺序进行正则表达式匹配。最早匹配的location将返回里面的配置。

4.如果正则表达式能够匹配到请求的uri,将使用这个正则对应的location,如果没有,则使用第二条匹配的结果。

server_name

查看维基:server_name

server_name用于配置基于域名或IP的虚拟主机,这个指令也是可以使用正则表达式的,但是注意,这个指令中的正则

表达式不用带任何的标识符,但是必须以~开头:

代码如下

复制代码

server {

server_name www.example.com ~^wwwd+.example.com$;

}

server_name指令中的正则表达式可以使用引用,高级的应用可以查看这篇文章:在server_name中使用正则表达式

fastcgi_split_path_info

查看维基:fastcgi_split_path_info

这个指令按照CGI标准来设置SCRIPT_FILENAME (SCRIPT_NAME)和PATH_INFO变量,它是一个被分割成两部分(两个引用

)的正则表达式。如下:

代码如下

复制代码

location ~ ^.+.php {

(...)

fastcgi_split_path_info ^(.+.php)(.*)$;

fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name;

fastcgi_param PATH_INFO $fastcgi_path_info;

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

(...)

}

第一个引用(.+.php)加上/path/to/php将作为SCRIPT_FILENAME,第二个引用(.*)为PATH_INFO,例如请求的完整

URI为show.php/article/0001,则上例中SCRIPT_FILENAME的值为/path/to/php/show.php,PATH_INFO则

为/article/0001。

这个指令通常用于一些通过PATH_INFO美化URI的框架(例如CodeIgniter)。

gzip_disable

查看维基:gzip_disable

通过正则表达式来指定在哪些浏览器中禁用gzip压缩。

gzip_disable "msie6";rewrite

查看维基:rewrite

这个指令应该也是用的比较多的,它需要使用完整的包含引用的正则表达式:

代码如下

复制代码

rewrite "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;通常环境下我们

会把它和if结合来使用:

代码如下

复制代码

if ($host ~* www.(.*)) {

set $host_without_www $1;

rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1为'/foo',而不是'www.mydomain.com/foo'

}

Nginx中的正则如何匹配中文

首先确定在编译pcre时加了enable-utf8参数,如果没有,请重新编译pcre,然后就可以在Nginx的配置文件中使用这

样的正则:”(*UTF8)^/[x{4e00}-x{9fbf}]+)$”注意引号和前面的(*UTF8),(*UTF8)将告诉这个正则切换为UTF8模

式。

代码如下

复制代码

[root@backup conf]# pcretest

PCRE version 8.10 2010-06-25

re> /^[x{4e00}-x{9fbf}]+/8

data> 测试

0: x{6d4b}x{8bd5}

data> Nginx模块参考手册中文版

No match

data> 参考手册中文版

0: x{53c2}x{8003}x{624b}x{518c}x{4e2d}x{6587}x{7248}

location顺序错误导致下载.php源码而不执行php程序的问题

看下面的例子片断(server段、wordpress安装到多个目录):

=====================================

代码如下

复制代码

location / {

try_files $uri $uri/ /index.html;

}

location /user1/ {

try_files $uri $uri/ /user1/index.php?q=$uri&$args;

}

location ~* ^/(user2|user3)/ {

try_files $uri $uri/ /$1/index.php?q=$uri&$args;

}

location ~ .php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fastcgi_params;

}

=====================================

nginx.conf的配置代码看上去没有任何问题,而事实上:

访问 /user1/会正常执行php程序。

访问 /user2/ 或 /user3/ 都不会执行程序,而是直接下载程序的源代码。

原因在哪里?看到他们地区别了吗?

/user1/是普通location写法

而/user2/ 或 /user3/ 是正则表达式匹配的location

问题就出在了/user2/ 或 /user3/匹配location指令使用了正则表达式,所以必须注意代码段的先后顺序,必须把

location ~ .php$ {...}段上移、放到它的前面去。

正确的代码举例:

=====================================

代码如下

复制代码

location / {

try_files $uri $uri/ /index.html;

}

location /user1/ {

try_files $uri $uri/ /user1/index.php?q=$uri&$args;

}

location ~ .php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fastcgi_params;

}

location ~* ^/(user2|user3)/ {

try_files $uri $uri/ /$1/index.php?q=$uri&$args;

}

=====================================

【注意】对于普通location指令行,是没有任何顺序的要求的。如果你也遇到了类似的问题,可以尝试调整使用正则

表达式的location指令片断的顺序来调试

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Nginx 】nginx的正则表达式 的相关文章

  • 命名 Docker 卷以共享构建而不更新

    我工作的公司的开发人员要求我用 Docker 做一些不同的事情 然后我也被使用了 目标是拥有 2 个具有以下职责的容器 容器A 节点容器将构建前端 React 应用程序并将捆绑包放入名为的目录中app dist 完成后 容器将停止运行 容器
  • 为什么在生产中得到空 CSS 文件?

    我在文件中放入了很多css文件active admin css scss Active Admin s got SASS import active admin mixins import active admin base import
  • 比较 nginx+Apache+mod_wsgi 与 nginx+uWSGI?

    在生产中使用 nginx Apache mod wsgi 与 nginx uWSGI vurtualenv 有何优缺点 我在自 2007 年以来开发的 mod wsgi 中看到了第一个变体的优点 并且具有更稳定的版本和易于管理 第二种变体的
  • 通过 nginx 入口控制器进行基本身份验证

    我正在使用 nginx 入口控制器 https kubernetes github io ingress nginx deploy https kubernetes github io ingress nginx deploy 在 AWS
  • Kong - 验证上游 ssl(ssl_proxy 打开)

    我已经成功为 API 安装了 kong 网关 该 API 通过上游负载平衡到多个目标 应用程序服务器 现在 我有一个我的应用程序服务器的自签名证书 kong 和目标之间的 ssl 握手应该失败 我推断 kong 不验证上游证书 经过一些研究
  • Kubernetes nginx 入口控制器返回 502,但仅适用于 AJAX/XmlHttpRequest 请求

    我有一个在 nginx 入口控制器后面运行 Kubernetes 的 Web 应用程序 它对于请求浏览工作正常 但来自浏览器的任何 AJAX XMLHTTPRequest 都会从 nginx 收到 502 错误 我捕获了常规请求和 AJAX
  • NGINX 与 Tomcat 配置

    我是 Nginx 新手 我需要你的帮助 根据很多论坛我了解到我们所有的静态页面都存储在Nginx中 当有请求到来时 我必须将该请求传递给 tomcat 获取数据 并在 tomcat 生成响应后生成响应 目前 我刚刚做到了 我将请求直接传递给
  • nginx 将虚拟目录重写为文件

    这应该很容易做到 但我的头撞在墙上了 如果我收到对 www mysite com mypath 的请求 我想提供 www mysite com myotherpath thisfile html 的内容 我如何使用 nginx 配置来做到这
  • kubernetes nginx ingress 无法将 HTTP 重定向到 HTTPS

    我有一个托管在 Google Cloud 平台中的网络应用程序 该应用程序位于负载均衡器后面 而负载均衡器本身位于入口后面 入口设置了 SSL 证书 并按预期接受 HTTPS 连接 但有一个问题 我无法让它将非 HTTPS 连接重定向到 H
  • Docker:Nginx 和 php5-fpm docker 不说话

    我想进行完全 Docker 化的 Drupal 安装 我的第一步是让容器与 Nginx 和 php5 fpm 一起运行 两者都基于 Debian 我在 CoreOS alpha 频道 使用 Digital Ocean 我的 Dockerfi
  • Nginx反向代理返回404

    我的 Nginx 安装并运行 下面是配置 etc nginx nginx conf 我要全部转发 api 到我的 tomcat 服务器 该服务器在同一服务器上的端口 9100 上运行 类型http myhost 9100 api apps有
  • 将应用程序级别用户名/用户 ID 注入 nginx/Apache 日志

    有没有办法将应用程序级别的用户名或 id 在本例中为 django 用户名或 id 注入 Apache 或 ngnix 日志中 请注意 我不是询问 HTTP 身份验证用户名 我目前正在使用一个简短的自定义中间件将此数据添加到响应标头 如下所
  • 为什么 opcache 没有刷新?

    我用guzzlehttp guzzle封装在拉拉维尔 8 升级到后PHP 8 I get Symfony Component ErrorHandler Error FatalError Invalid opcode 117 2 0 in f
  • nginx位置正则表达式,匹配多次

    如何在 nginx 位置正则表达式中多次匹配 看来 x x 语法永远不起作用 例如 location abc w 1 3 从来不工作 您必须引用包含以下内容的位置 or 人物 location abc w 1 3 否则 nginx 将其解析
  • 使用nginx容器作为反向代理时的原始url

    我有一个 Web 应用程序部署为码头集装箱 我也有一个nginx容器 使用dnsmasq解析器 设置为充当 Web 应用程序前面的反向代理 它的 80 端口映射到主机 我的应用程序使用 SSO 身份验证 当我使用身份提供商登录时 回调 ur
  • Nginx 是否也缓冲来自客户端的 http 请求?

    我知道 Nginx 可以缓冲来自上游服务器的响应 我的问题是 Nginx 是否也缓冲来自客户端的 http 请求 我的意思是 如果 Nginx 从客户端收到 http 请求 它是否立即与上游服务器建立连接 或者它会在收到整个http请求后创
  • 在 docker 中将 pgadmin 连接到 postgres

    我有一个docker compose与服务文件python nginx postgres and pgadmin services postgres image postgres 9 6 env file env volumes postg
  • 错误请求 400:nginx/gunicorn

    我已经遵循了这个教程 http blog wercker com 2013 11 25 django 16 part3 html http blog wercker com 2013 11 25 django 16 part3 html我现
  • 上游太大 - nginx + codeigniter

    我从 Nginx 收到此错误 但似乎无法弄清楚 我正在使用 codeigniter 并使用数据库进行会话 所以我想知道标题怎么会太大 有没有办法检查标题是什么 或者看看我能做些什么来修复这个错误 如果您需要我提供任何conf文件或其他文件
  • 使用查询参数值进行 NGINX 301 重定向

    我想重定向example com lang en to example com en 我正在使用 Python Django 我的服务器运行 Plesk Nginx 我尝试像这样在我的网页上重定向 但这是行不通的 rewrite lang

随机推荐

  • Java如何使用SAX(Simple API for XML)解析XML呢?

    转自 Java如何使用SAX Simple API for XML 解析XML呢 下文讲述使用SAX解析xml文档的方法分享 如下所示 SAX简介 SAX用于加载文档到内存中 它是采用事件驱动的API Observer模式 他按照xml文件
  • 微软customvision在线图片分类器使用

    参考 https zhuanlan zhihu com p 28820161 customvision官网 https www customvision ai 注册了可以自己建立新项目 创建自己需要的图片分类器 训练好模型后可以调用api进
  • Linux+设计模式

    目录标题 Linux常用命令 常用的50个 服务器文件复制 查看端口占用 查看进程信息 内存占用率 Linux的管道原理 孤儿进程 僵尸进程 观察者模式 Linux常用命令 常用的50个 linux常用命令 50个 服务器文件复制 使用sc
  • 明尼苏达量表结果分析_明尼苏达多项人格测验(MMPI) 结果分析

    展开全部 MMPI测试 量表简介 俗称心理CT 对心32313133353236313431303231363533e78988e69d8331333238666363理健康和心理素质进行比较全面的测量 是正常人和心理障碍者都可以使用的心理
  • 架构制图--工具与方法论

    简介 软件工程也是工程 因此传统工程制图的一些基本理论 在软件行业同样适用 但另一方面 软件与实体制造业之间还是有着本质区别 所以在制图方面的需求和方式也大相径庭 无法直接套用 作为软件行业的从业者 你可以完全不懂工程制图 但你不得不懂架构
  • 程序员在国企的六年

    第一年 第二年 第三年 第四年 第五年 第六年 行了 我要接着写代码了
  • PHP自学---黑马程序员笔记【持续更新】

    视频 https www bilibili com video BV18x411H7qD p 3 目录 基础 1 静态网站访问原理 2 动态网站访问 3 C S B S 4 MySQL访问流程 5 PHP连接MySQL数据库 6 配置虚拟主
  • 多智能体强化学习基础知识(入门级)

    参考资料 王树森 深度强化学习 https github com wangshusen DRL
  • 使用python计算出矩形的面积

    w 4 h 5 print width w height h area area w h
  • mac如何创建mysql数据库

    使用mac创建mysql数据库十分简单 我们只需要按照以下步骤即可完成 首先 我们需要安装mysql 我们可以通过官网下载对应的安装包 或者通过Homebrew进行安装 接下来 我们需要启动mysql服务 在终端中输入以下命令 sudo m
  • 在钉钉上怎么手写_胖·评测|亲测!磐度A5数字纸笔手写板能适配多少直播平台?...

    停课不停学 各大科技企业纷纷推出各类教学平台吗 一时之间可谓百家争鸣 但是对于一线教师而言 除了为可怕的直播拥堵与繁琐的直播操作而头痛之外 一个更可怕的事实出现了 解题答疑 没有趁手的好工具怎么搞定各类公式 解题步骤的书写啊 胖胖老师今天就
  • 关于win10启动ubuntu报错

    关于win10启动ubuntu报错 错误类型 参考的对象类型不支持尝试的操作 问题描述 win10启动ubuntu报错 参考的对象类型不支持尝试的操作 解决方法 以管理员身份打开Windows PowerShell 然后执行netsh wi
  • 【状态估计】无迹卡尔曼滤波(UKF)应用于FitzHugh-Nagumo神经元动力学研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文献 1 概述 文献来源 本文综述了连续非线性动力系统噪
  • 动态链接,程序内部的共享单车

    前言 在之前说过 程序的编译过程是 编译 汇编 链接 前面的两种方式我们已经充分的理解过了 现在我们来说说我们的链接过程 我们很多时候要做到代码的复用 我们就需要链接不同的库 这么来说 我们链接的过程就有点像生活中标准化 模块化的生产 我们
  • 入门级题解14. 最长公共前缀

    题目 编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀 返回空字符串 解题思路 比较 比较 挨个比较 横向比较实现过程 我有一个问题就是喜欢新设变量 之前链表也是 直接用题目中的 这里也是 先用s1做最长公共子串 第一步之后
  • 【代码审计】51 PHP项目类 RCE 文件包含和下载

    runaway xhcms 无框架 文件包含跨站 搜索或应用 include 找核心代码分析 通过搜索关键字echo 测试XSS漏洞 测试文件包含漏洞 earmusic 无框架 文件下载 搜索或应用功能 down 根据程序实现的功能猜测可能
  • Docker(12)CIG容器重量级监控系统

    文章目录 CIG是啥 CAdvisor 监控工具 InfluxDB Granfana CIG写入compose编排 CIG是啥 CAdvisor InfluxDB Granfana CIG CAdvisor 监控工具 CAdvisor是一个
  • How to print a c++ object members using GDB from an address if the object's class type is like A::B

    How to print a c object members using GDB from an address if the object s class type is like A B duplicate linux How to
  • vue的创建问题和axios问题

    文章思路来源于网络以及自己的尝试和理解 使用命令行执行vue相关的npm命令的前提 下载nodejs 版本不要太旧 下载nodejs时会自动下载npm的相关的包 并在安装nodejs时注意环境变量 特别时对npm的环境变量的添加 的添加 v
  • 【Nginx 】nginx的正则表达式

    1 nginx配置基础 1 正则表达式匹配 区分大小写匹配 不区分大小写匹配 和 分别为区分大小写不匹配及不区分大小写不匹配 以什么开头的匹配 以什么结尾的匹配 转义字符 可以转 等 代表任意字符 2 文件及目录匹配 f和 f用来判断是否存