关于nginx:nginx-正则表达式

10次阅读

共计 4520 个字符,预计需要花费 12 分钟才能阅读完成。

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 指令片断的程序来调试

正文完
 0