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