location能够把不一样方式的请求,定位到不一样的处理方式上.php
location ~* /js/.*/\.js 以 = 开头,表示精确匹配;如只匹配根目录结尾的请求,后面不能带任何字符串。 以^~ 开头,表示uri以某个常规字符串开头,不是正则匹配 以~ 开头,表示区分大小写的正则匹配; 以~* 开头,表示不区分大小写的正则匹配 以/ 开头,通用匹配, 若是没有其它匹配,任何请求都会匹配到
location 的匹配顺序是“先匹配正则,再匹配普通”。css
矫正: location 的匹配顺序实际上是“先匹配普通,再匹配正则”。我这么说,你们必定会反驳我,由于按“先匹配普通,再匹配正则”解释不了你们平时习惯的按“先匹配正则,再匹配普通”的实践经验。这里我只能暂时解释下,形成这种误解的缘由是:正则匹配会覆盖普通匹配。html
# 精确匹配 / ,主机名后面不能带任何字符串nginx
location = / { [ configuration A ] }
2.# 全部的地址都以 / 开头,因此这条规则将最后匹配到默认请求web
# 可是正则和最长字符串会优先匹配
location / { [ configuration B ] }
例:正则表达式
location / { proxy_pass http://server_pools; } #这条规则只有其余不符合要求才能匹配到;将是最后匹配到的,匹配度最低,上面实现的功能是:好比网站是www.blog.com;后面什么都不输入的时候,
其余的规则也不匹配的时候,最后交给负载均衡池的服务器
3.# 匹配任何以 /documents/ 开头的地址,匹配符合之后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条后端
location /documents/ {
[ configuration C ]
}
例:浏览器
location /static/ { rewrite ^ http://www.abc.com ; } #上面实现的功能:假设网站域名为www.blog.com;那么配置上面的功能是输入www.blog.com/static/时,无论static后面是什么页面(页面也能够不存在), 那么最终会一样跳转到www.abc.com这个网站。
4.# 匹配任何以 /documents/ 开头的地址,匹配符合之后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条tomcat
location ~ /documents/Abc { [ configuration CC ] }
5.# 匹配任何以 /images/ 开头的地址,匹配符合之后,中止往下搜索正则,采用这一条。服务器
location ^~ /images/ {
[ configuration D ]
}
6.# 匹配全部以 gif,jpg或jpeg 结尾的请求
# 然而,全部请求 /images/ 下的图片会被 config D 处理,由于 ^~ 到达不了这一条正则
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
例:
7.# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
location /images/ {
[ configuration F ]
}
8.# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F与G的放置顺序是没有关系的
location /images/abc {
[ configuration G ]
}
9.# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
location ~ /images/abc/ {
[ configuration H ]
}
按照上面的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/ } http://tengine.taobao.org/book/chapter_02.html http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
rewrite只能放在 server{}, location{}, if{}中,而且只能对域名后边的除去传递的参数外的字符串起做用。 例如 http://seanlook.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。
1 执行server块的rewrite指令 2 执行location匹配 3 执行选定的location中的rewrite指令
1 例1:
2 http { 3 # 定义image日志格式 4 log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status; 5 # 开启重写日志 6 rewrite_log on; 7 8 server { 9 root /home/www; 10 11 location / { 12 # 重写规则信息 13 error_log logs/rewrite.log notice; 14 # 注意这里要用‘’单引号引发来,避免{} 15 rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4; 16 # 注意不能在上面这条规则后面加上“last”参数,不然下面的set指令不会执行 17 set $image_file $3; 18 set $image_type $4; 19 } 20 21 location /data { 22 # 指定针对图片的日志格式,来分析图片类型和大小 23 access_log logs/images.log mian; 24 root /data/images; 25 # 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,若是还不在就跳转到最后一个url里 26 try_files /$arg_file /image404.html; 27 } 28 location = /image404.html { 29 # 图片不存在返回特定的信息 30 return 404 "image not found\n"; 31 } 32 } 33 34 对形如/images/ef/uh7b3/test.png的请求,重写到/data?file=test.png,因而匹配到location /data,先看/data/images/test.png文件存不存在,若是存在则正常响应,若是不存在则重写tryfiles到新的image404 location,直接返回404状态码。 35 36 例2: 37 rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last; 38 对形如/images/bla_500x400.jpg的文件请求,重写到/resizer/bla.jpg?width=500&height=400地址,并会继续尝试匹配location。
当表达式只是一个变量时,若是值为空或任何以0开头的字符串都会当作false 直接比较变量和内容时,使用=或!= ~ 正则表达式匹配 ~* 不区分大小写的匹配 !~ 区分大小写的不匹配 -f和!-f 用来判断是否存在文件 -d和!-d 用来判断是否存在目录 -e和!-e 用来判断是否存在文件或目录 -x和!-x 用来判断文件是否可执行
1 若是用户设备为IE浏览器的时候,重定向 2 if ($http_user_agent ~ MSIE) { 3 rewrite ^(.*)$ /msie/$1 break; 4 } //若是UA包含"MSIE",rewrite请求到/msid/目录下 5 6 if ($http_cookie ~* "id=([^;]+)(?:;|$)") { 7 set $id $1; 8 } //若是cookie匹配正则,设置变量$id等于正则引用部分 9 10 if ($request_method = POST) { 11 return 405; 12 } //若是提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302 13 14 if ($slow) { 15 limit_rate 10k; 16 } //限速,$slow能够经过 set 指令设置 17 18 if (!-f $request_filename){ 19 break; 20 proxy_pass http://127.0.0.1; 21 } //若是请求的文件名不存在,则反向代理到localhost 。这里的break也是中止rewrite检查 22 23 if ($args ~ post=140){ 24 rewrite ^ http://example.com/ permanent; 25 } //若是query string中包含"post=140",永久重定向到example.com 26 27 location ~* \.(gif|jpg|png|swf|flv)$ { 28 valid_referers none blocked www.jefflei.comwww.leizhenfang.com; 29 if ($invalid_referer) { 30 return 404; 31 } //防盗链 32 }
例:
1 http://localhost:88/test1/test2/test.php 2 $host:localhost 3 $server_port:88 4 $request_uri:http://localhost:88/test1/test2/test.php 5 $document_uri:/test1/test2/test.php 6 $document_root:/var/www/html 7 $request_filename:/var/www/html/test1/test2/test.php