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