nginx配置location与rewrite规则教程
location 教程示例:
location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] }location / { # 由于所有的地址都以 / 开头,以是这条规则将匹配到所有要求 # 但是正则和最长字符串会优先匹配 [ configuration B ] }location /documents/ { # 匹配任何以 /documents/ 开头的地址,匹配符合往后,还要连续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采取这一条 [ configuration C ] }location ~ /documents/Abc { # 匹配任何以 /documents/ 开头的地址,匹配符合往后,还要连续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采取这一条 [ configuration CC ] }location ^~ /images/ { # 匹配任何以 /images/ 开头的地址,匹配符合往后,停滞往下搜索正则,采取这一条。 [ configuration D ] }location ~ \.(gif|jpg|jpeg)$ { # 匹配所有以 gif,jpg或jpeg 结尾的要求 # 然而,所有要求 /images/ 下的图片会被 config D 处理,由于 ^~ 到达不了这一条正则 [ configuration E ] }location /images/ { # 字符匹配到 /images/,连续往下,会创造 ^~ 存在 [ configuration F ] }location /images/abc { # 最长字符匹配到 /images/abc,连续往下,会创造 ^~ 存在 # F与G的放置顺序是没有关系的 [ configuration G ] }location ~ /images/abc/ { # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,连续往下搜索,匹配到这一条正则,采取 [ configuration H ] }location ~ /js/./\.js
已=开头表示精确匹配。如 A 中只匹配根目录结尾的要求,后面不能带任何字符串。^~ 开头表示uri以某个常规字符串开头,不是正则匹配~ 开头表示区分大小写的正则匹配~ 开头表示不区分大小写的正则匹配/ 通用匹配, 如果没有其它匹配,任何要求都会匹配到
顺序 && 优先级

(location =) > (location 完全路径) > (location ^~ 路径) > (location ~,~ 正则顺序) > (location 部分起始路径) > (/)
按照上面的location写法,以下的匹配示例成立:
/ —> config A 精确完备匹配,纵然/index.html也匹配不了/downloads/download.html —> config B 匹配B往后,往下没有任何匹配,采取B/images/1.gif —> configuration D 匹配到F,往下匹配到D,停滞往下/images/abc/def —> config D 最长匹配到G,往下匹配D,停滞往下你可以看到 任何以/images/开头的都会匹配到D并停滞,FG写在这里是没有任何意义的,H是永久轮不到的,这里只是为相识释匹配顺序/documents/document.html —> config C 匹配到C,往下没有任何匹配,采取C/documents/1.jpg —> configuration E 匹配到C,往下正则匹配到E/documents/Abc.jpg —> config CC 最长匹配到C,往下正则顺序匹配到CC,不会往下到E实际利用建议#以是实际利用中,个人以为至少有三个匹配规则定义,如下:#直接匹配网站根,通过域名访问网站首页比较频繁,利用这个会加速处理,官网如是说。#这里是直接转发给后端运用做事器了,也可以是一个静态首页# 第一个必选规则location = / { proxy_pass http://tomcat:8080/index}# 第二个必选规则是处理静态文件要求,这是nginx作为http做事器的强项# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配利用location ^~ /static/ { root /webroot/static/;}location ~ \.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/;}#第三个规则便是通用规则,用来转发动态要求到后端运用做事器#非静态文件要求就默认是动态要求,自己根据实际把握#毕竟目前的一些框架的盛行,带.php,.jsp后缀的情形很少了location / { proxy_pass http://tomcat:8080/}
Rewrite教程
rewrite功能便是,利用nginx供应的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在 server{},location{},if{} 中,并且只能对域名后边的撤除通报的参数外的字符串起浸染,例如 http://seanlook.com/a/we/index.php?id=1&u=str 只对 /a/we/index.php 重写。语法 rewrite regex replacement [flag];
如果相对域名或参数字符串起浸染,可以利用全局变量匹配,也可以利用proxy_pass反向代理。
表明看rewrite和location功能有点像,都能实现跳转,紧张差异在于rewrite是在同一域名内变动获取资源的路径,而location是对一类路径做掌握访问或反向代理,可以proxy_pass到其他机器。很多情形下rewrite也会写在location里,它们的实行顺序是:
实行server块的rewrite指令实行location匹配实行选定的location中的rewrite指令,如果个中某步URI被重写,则重新循环实行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error缺点。flag标志位last : 相称于Apache的[L]标记,表示完成rewritebreak: 停滞实行当前虚拟主机的后续rewrite指令集redirect: 返回302临时重定向,地址栏会显示跳转后的地址permanent: 返回301永久重定向,地址栏会显示跳转后的地址由于301和302不能大略的只返回状态码,还必须有重定向的URL,这便是return指令无法返回301,302的缘故原由了。这里 last 和 break 差异有点难以理解:
last 一样平常写在server和if中,而break一样平常利用在location中last 不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配break 和 last 都能组织连续实行后面的rewrite指令if指令与全局变量if判断指令
语法为 if(condition){...},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被实行,if条件(conditon)可以是如下任何内容:
当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false直接比较变量和内容时,利用 = 或 !=~ 正则表达式匹配,~ 不区分大小写的匹配,!~ 区分大小写的不匹配-f 和 !-f 用来判断是否存在文件-d 和 !-d 用来判断是否存在目录-e 和 !-e 用来判断是否存在文件或目录-x 和 !-x 用来判断文件是否可实行例如:
if ($http_user_agent ~ MSIE) { rewrite ^(.)$ /msie/$1 break;} #如果UA包含"MSIE",rewrite要求到/msid/目录下if ($http_cookie ~ "id=([^;]+)(?:;|$)") { set $id $1; } #如果cookie匹配正则,设置变量$id即是正则引用部分if ($request_method = POST) { return 405;} #如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302if ($slow) { limit_rate 10k;} #限速,$slow可以通过 set 指令设置if (!-f $request_filename){ break; proxy_pass http://127.0.0.1; } #如果要求的文件名不存在,则反向代理到localhost 。这里的break也是停滞rewrite检讨if ($args ~ post=140){ rewrite ^ http://example.com/ permanent;} #如果query string中包含"post=140",永久重定向到example.comlocation ~ \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.jefflei.com www.leizhenfang.com; if ($invalid_referer) { return 404; } #防盗链}
全局变量
下面是可以用作 if判断 的全局变量
$args: #这个变量即是要求行中的参数,同 $query_string$content_length : 要求头中的Content-length字段。$content_type : 要求头中的Content-Type字段。$document_root : 当前要求在root指令中指定的值。$host : 要求主机头字段,否则为做事器名称。$http_user_agent : 客户端agent信息$http_cookie : 客户端cookie信息$limit_rate : 这个变量可以限定连接速率。$request_method : 客户端要求的动作,常日为GET或POST。$remote_addr : 客户真个IP地址。$remote_port : 客户真个端口。$remote_user : 已经经由Auth Basic Module验证的用户名。$request_filename : 当前要求的文件路径,由root或alias指令与URI要求天生。$scheme : HTTP方法(如http,https)。$server_protocol : 要求利用的协议,常日是HTTP/1.0或HTTP/1.1。$server_addr : 做事器地址,在完成一次系统调用后可以确定这个值。$server_name : 做事器名称。$server_port : 要求到达做事器的端口号。$request_uri : 包含要求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。$uri : 不带要求参数确当前URI,$uri不包含主机名,如”/foo/bar.html”。$document_uri : 与$uri相同。示例:http://localhost:88/test1/test2/test.php$host:localhost$server_port:88$request_uri:http://localhost:88/test1/test2/test.php$document_uri:/test1/test2/test.php$document_root:/var/www/html$request_filename:/var/www/html/test1/test2/test.php常用正则. : 匹配除换行符以外的任意字符? : 重复0次或1次+ : 重复1次或更多次: 重复0次或更多次\d :匹配数字^ : 匹配字符串的开始$ : 匹配字符串的先容{n} : 重复n次{n,} : 重复n次或更多次[c] : 匹配单个字符c[a-z] : 匹配 a-z 小写字母的任意一个小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里脸庞易让人困惑的是\转义分外字符。rewrite实例例1:
http { # 定义image日志格式 log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status; # 开启重写日志 rewrite_log on; server { root /home/www; location / { # 重写规则信息 error_log logs/rewrite.log notice; # 把稳这里要用‘’单引号引起来,避免{} rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.)\.(png|jpg|gif)$' /data?file=$3.$4; # 把稳不能在上面这条规则后面加上“last”参数,否则下面的set指令不会实行 set $image_file $3; set $image_type $4; } location /data { # 指定针对图片的日志格式,来剖析图片类型和大小 access_log logs/images.log mian; root /data/images; # 运用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到末了一个url里 try_files /$arg_file /image404.html; } location = /image404.html { # 图片不存在返回特定的信息 return 404 "image not found\n"; }}
对形如 /images/ef/uh7b3/test.png 的要求,重写到 /data?file=test.png,于是匹配到 location /data,先看/data/images/test.png文件存不存在,如果存在则正常相应,如果不存在则重写tryfiles到新的image404 location,直接返回404状态码。
例2:
rewrite ^/images/(.)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;
对形如/images/bla_500x400.jpg的文件要求,重写到/resizer/bla.jpg?width=500&height=400地址,并会连续考试测验匹配location。
文章来源http://seanlook.com/