`

Nginx中的正则表达式

阅读更多

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_pagetry_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   ~^www\d+\.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'
}

需要注意的是rewrite后面的第一个正则参数永远是只对URI进行匹配,而不是对完整的带主机头的URL,如上例中,if语句来判断主机头,如果匹配www\.(.*),则设置一个变量$host_without_www的值为www\.(.*)的引用,如果上例中的请求URL为www.mydomain.com/foo,则$host_without_www的值为mydomain.com,而下面的rewrite指令中,第一个正则表达式的引用将为/foo,则最终通过这个重写后的请求URL为http://mydomain.com/foo。

3、Nginx中的正则如何匹配中文

首先确定在编译pcre时加了enable-utf8参数,如果没有,请重新编译pcre,然后就可以在Nginx的配置文件中使用这样的正则:”(*UTF8)^/[\x{4e00}-\x{9fbf}]+)$”注意引号和前面的(*UTF8),(*UTF8)将告诉这个正则切换为UTF8模式。

4、如何测试你的正则表达式

通常我们在Nginx安装之前会编译安装pcre,它自带一个小工具:pcretest,使用方法以下:

[root@backup conf]# pcretest
PCRE version 8.10 2010-06-25

  re> /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3,3}$/  ###这是一个匹配IP的正则
data> 192.168.10.1
 0: 192.168.10.1
 1: 192
 2: .1
 3: 1
data> 666.666.666.666
No match
data> 255.255.255.255
 0: 255.255.255.255
 1: 255
 2: .255
 3: 255
data> 0.0.0.0
 0: 0.0.0.0
 1: 0
 2: .0
 3: 0
data> 666777
No match

匹配中文:

[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}

注意正则表达式后面的8,它表示这条正则使用UTF-8匹配。

 

 

原文转自:http://www.howtocn.org/nginx:pcre

分享到:
评论

相关推荐

    45 - Nginx中的正则表达式.mp4

    例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、...

    使用Java正则表达式分析处理日志

    Java中的正则表达式主要通过`java.util.regex`包中的类来实现,如`Pattern`和`Matcher`。 在日志处理中,我们通常需要完成以下任务: 1. **过滤日志级别**:日志通常包含不同的级别,如DEBUG、INFO、WARN、ERROR等...

    nginx的正则表达式,logstash用

    nginx的正则表达式,logstash用。grok是一种采用组合多个预定义的正则表达式,用来匹配分割文本并映射到关键字的工具。通常用来对日志数据进行预处理。

    nginx用正则表达式实现泛域名自动匹配目录的方法

    主要介绍了nginx用正则表达式实现泛域名自动匹配目录的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    页面静态化的正则表达式

    这同样涉及正则表达式,例如Nginx的配置中可以使用`rewrite ^/article/(\d+).html /index.php?id=$1 last;`来实现重写。 4. **静态化过程中的错误处理** 当处理大量页面时,可能会遇到无效的URL或正则匹配失败的...

    Nginx Location 正则_NginxLocation正则.md_

    nginx正则表达式. : 匹配除换行符以外的任意字符? : 重复0次或1次+ : 重复1次或更多次* : 重复0次或更多次\d :匹配数字^ : 匹配字符串的开始$ : 匹配字符串的介绍{n} : 重复n次{n} : 重复n次或更多次[c] :...

    Nginx正则表达式相关的参数和规则介绍

    以上介绍了Nginx正则表达式的参数和规则,包括修饰符的含义和正则表达式匹配符号的用法。掌握这些知识对于配置和优化Nginx服务器非常重要。熟练使用这些参数和规则,可以灵活地处理各种复杂的HTTP请求,并能够提高...

    Nginx if语句加正则表达式实现字符串截断

    在Nginx中,可以通过配置实现各种功能,例如通过if语句和正则表达式实现字符串截断。这一技术在处理网络请求时提供了灵活的解决方案,尤其适用于需要对URL、参数或任何其他字符串值进行特定操作的场景。 首先,我们...

    PHP实例开发源码—正则表达式在线测试 php版.zip

    在本压缩包“PHP实例开发源码—正则表达式在线测试 php版.zip”中,包含了一个基于PHP的正则表达式在线测试平台的源代码。这个实例是开发者学习和测试正则表达式功能的好工具,它可以帮助我们理解和运用PHP中的正则...

    PHP 伪静态 网址参数中的【中文正则表达式】问题.rar

    伪静态通常通过重写URL来完成,主要利用服务器的URL重写功能,如Apache的`.htaccess`或Nginx的配置文件,以及PHP的内置函数如`$_SERVER['REQUEST_URI']`来获取原始URL,然后通过正则表达式解析和处理URL,最后动态...

    nginx location 配置 正则表达式实例详解

    **Nginx Location 配置正则表达式详解** 在Nginx服务器配置中,`location`指令扮演着至关重要的角色。它允许我们根据请求的URI(Uniform Resource Identifier)进行精细化处理,例如转发请求到不同的后端服务、提供...

    ️ 讲解关于正则表达式,前端,后端等相关的知识。也记录自己的一些学习内容.zip

    5. **服务器配置**:例如在Apache或Nginx的配置文件中,正则表达式用于定义重写规则。 博客文件`blog-master`通常表示这是一个博客项目的源代码仓库,其中可能包含多个Markdown文件或HTML页面,记录了作者关于正则...

    如何利用nginx通过正则拦截指定url请求详解

    在本文中,我们将深入探讨如何使用Nginx服务器通过正则表达式拦截特定的URL请求。Nginx是一个高性能的Web服务器,它以其高效的静态文件处理能力和强大的反向代理功能而闻名。在许多Web应用程序架构中,Nginx被用作...

    基于PHP的正则表达式在线测试php版源码.zip

    通过这个平台,开发者可以方便地验证他们的正则表达式是否按照预期工作,而无需编写完整的应用程序或在命令行环境中进行测试。源代码的可用性意味着用户可以自定义、扩展或研究代码以适应他们的特定需求。 【标签】...

    文本三剑客之grep及正则表达式 -.pdf

    这使得用户可以在正则表达式中使用更多语法,例如 `{n,m}` 和无限重复符 `*`、`+` 等,但需要特别注意的是,在 ERE 中 `\b`、`\B`、`\和 `\>` 等边界匹配字符需要保持原有的反斜杠转义。 - **fgrep (grep -F)**:...

Global site tag (gtag.js) - Google Analytics