Nginx系列教程:Nginx中的正则表达式

1、if指令

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

if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break;} if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) { set $id $1;}

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

~为区分
大小写的匹配。 ~*不区分大小写的匹配(匹配firefox的正则同时匹配FireFox)。 !~和!~*意为“不匹配的”。

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指令,不过他多了三个标识符,^~、=、@。并且它没有取反运算符!,这三个标识符的作用分别是:

^~ 标识符后面跟一个字符串。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。 = 表示精确的
查找地址,如location = /它只会匹配uri为/的请求,如果请求为/index.html,将查找另外的location,而不会匹配这个,当然可以写两个location,location = /和location /,这样/index.html将匹配到后者,如果你的站点对/的请求量较大,可以使用这个方法来加快请求的响应速度。 @ 表示为一个location进行命名,即自定义一个location,这个location不能被外界所访问,只能用于Nginx产生的子请求,主要为error_page和try_files。

注意,这3个标识符后面不能跟正则表达式,虽然配置文件检查会通过,而且没有任何警告,但是他们并不会进行匹配。
综上所述,location指令对于后面值的匹配顺序为:

标识符“=”的location会最先进行匹配,如果请求uri匹配这个location,将对请求使用这个location的配置。 进行字符串匹配,如果匹配到的location有^~这个标识符,匹配停止返回这个location的配置。 按照配置文件中定义的顺序进行正则表达式匹配。最早匹配的location将返回
里面的配置。 如果正则表达式能够匹配到请求的uri,将使用这个正则对应的location,如果没有,则使用第二条匹配的结果。

server_name

server_name用于配置基于域名或IP的虚拟主机,这个指令也是可以使用正则表达式的,但是注意,这个指令中的正则表达式不用带任何的标识符,但是必须以~开头:

server { server_name www.example.com ~^www\d+\.example\.com$;}

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

时间: 2024-09-21 02:33:50

Nginx系列教程:Nginx中的正则表达式的相关文章

grep 命令系列:grep 中的正则表达式

grep 命令系列:grep 中的正则表达式 在 Linux .类 Unix 系统中我该如何使用 Grep 命令的正则表达式呢? Linux 附带有 GNU grep 命令工具,它支持扩展正则表达式extended regular expressions,而且 GNU grep 在所有的 Linux 系统中都是默认有的.Grep 命令被用于搜索定位存储在您服务器或工作站上的任何信息. 正则表达式 正则表达式就是用于匹配每行输入的一种模式,模式是指一串字符序列.下面是范例: ^w1 w1|w2 [

Nginx系列教程:安装选项

编译时参数 configure决定系统的特性,以及nginx可以用来处理连接的某些特性和方法,最后它将创建Makefile. configure支持以下选项: –prefix=<path> - http://www.aliyun.com/zixun/aggregation/17166.html">安装路径,如果没有指定,默认为/usr/local/nginx. –sbin-path=<path> - nginx可执行命令的文件,如果没有指定,默认为<prefi

Nginx系列教程:Http Access Key模块

此模块没有被包含在Nginx官方安装包中. 这个模块可以阻止所有URL中未包含合法访问令牌的访问(防盗链).访问令牌可以由访问者IP或者其它服务器变量生成,所以可以很好地控制客户端的下载行为. 配置实例: location /download {&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; accesskey             on;  accesskey_hashmethod  md5;  access

Nginx系列教程:faq整理

faq中大部分问题来自http://www.stackoverflow.com与http://www.serverfault.com,有些可能未经过本人验证. Nginx如何替换错误 Q:能否用503错误(负载过高或临时不可用)来代替502错误作为应答返回?A:配置fastcgi_intercept_errors指令并将其设置为on,然后使用error_page指令: location / { fastcgi_pass 127.0.0.1: 9001; fastcgi_intercept_err

Nginx系列教程:LNMP多用户虚拟主机方案

A. 特点1. 高效.内存使用少.2. 权限分离,用户间互不干扰. B. 应用程序说明Nginx : 事件驱动的 Web 服务器,采用模块化设计,小巧.高效.PHP-CGI : PHP的CGI接口版本(本文使用FastCGI高效接口). C. 整个架构的简单说明Nginx 处理所有的 Web 请求,它将 PHP 的请求 Match 出,发送给上游服务器处理,这里的上游服务器就是 PHP-CGI.PHP-CGI 工作在 FastCGI 模式,它侦听着一个地址端口(或 Unix socket文件,建

Nginx系列教程:在server_name指令中使用正则表达式

server_http://www.aliyun.com/zixun/aggregation/11696.html">name的匹配顺序 nginx中的server_name指令主要用于配置基于名称虚拟主机,server_name指令在接到请求后的匹配顺序分别为:1.准确的server_name匹配,例如: server { listen 80; server_name howtocn.org www.howtocn.org; ...} 2.以*通配符开始的字符串: server { li

Nginx系列教程:Nginx二级子域名完美方案

对于批量添加http://www.aliyun.com/zixun/aggregation/14840.html">虚拟主机的需求,Apache 有 vhost_alias 模块帮忙.Nginx 呢? 其实神马都不需要, 同样可以实现 Nginx 二级域名匹配子文件夹,且不匹配 "www",但可以匹配包含 "www" 的子域名. 首先看看目前网上搜到的方法. if ( $host ~* (.*)\.(.*)\.(.*)) { set $subdoma

Nginx系列教程:nginx_substitutions_filter模块

nginx_substitutions_filter 请注意:此模块不是Nginx源的分布,可点击此链接找到安装说明, http://wiki.nginx.org/NginxHttpSubsModule#Installation . 概述 nginx_substitutions_filter 是一个过滤器模块,它可以在响应主体上运行正则表达式和固定字符串替换.该 模块不同于Nginx的本地替代模块.它能够扫描输出链缓冲区和匹配逐行字符串,类似于http://www.aliyun.com/zixu

Nginx系列教程:常用PHP程序Rewrite(伪静态规则)

Rewrite主要的功能就是实现URL的重写,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式.如果要想用到rewrite模块,必须先安装或加载rewrite模块. Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令.一个简单的Nginx Rewrite规则语法如下: rewrite ^/b/(.*)\.html