常州网管员

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1379|回复: 0

Nginx Location和Rewrite深入剖析

[复制链接]
发表于 2017-9-10 13:53:45 | 显示全部楼层 |阅读模式
Nginx Location
Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端的请求映射到一个location block,而location是Nginx配置中的一个指令,用于访问的URL匹配,而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
  • location功能是由ngx_http_index_module模块提供的。
  • location常放在server上下文。
  • location匹配与location的放置顺序无关,而是与location匹配规则的优先级有关。
常见的location匹配的URL方式如下:
[td]
符号意义
=字面精确匹配,精确到文件
^~URL的前缀匹配,不支持正则
~正则匹配检查,区分大小写
~*正则匹配检查,不区分大小写
/不带任何前缀
location匹配优先级如下:
(location =) > (location 完整路径)> (location ^~) > (location ~) > (location ~*) > ( location部分起始路径) > (location / )
Nginx Location规则案例:
  • 只会匹配/,优先级比location / 低,= file 匹配到file的优先级最高。
    location =/ { [ configuration L1  ] }
  • 直接匹配到到file,优先级最高。
    location =/index.html { [ configuration L2  ] }
  • 可以匹配任何请求,但是因为从 / 开始匹配,所有优先级最低。
    location / { [ configuration L3  ] }
  • 匹配任何以/images/开始的请求,并且停止匹配其他的loation;
    location = /images/ {  [ configuration L4 ]  }
  • 匹配以html、txt、gif、jpg、jpeg结尾的URL文件请求, 但是所有/images/目录的请求将由 [Configuration L4]处理。
    location ~* \.(html|txt|gif|jpg|jpeg)$ {   [ configuration L5]  }
浏览器发起HTTP Request URI案例与Location规则案例匹配如下:
        / ->匹配configuration L3;        /index.html匹配configuration L2;           /images/匹配configuration L4;        /images/logo.png匹配configuration L4;        /img/test.jpg匹配configuration L5。
生产环境中无需在Nginx.conf配置文件中同时添加五种规则匹配,如下为企业生产环境Nginx Location部分配置代码:
#匹配/,优先级最低location /{    root /var/www/html/;        expires      60d;}#匹配静态页面,由本地解析location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)${        root /var/www/html/;           expires      60d;      }#匹配动态页面,交给后端服务器location ~ .*\.(jsp|php|cgi|do)${    root /var/www/html/;    proxy_pass http://linux_web;    proxy_http_version 1.1;    proxy_set_header Connection "";    proxy_set_header Host  $host;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }#直接匹配newindex.html,优先级最高location =/newindex.html{    root /var/www/newwww/;        expires      60d;}Nginx Rewrite
Rewirte规则也称为规则重写,主要功能是实现浏览器访问HTTP URL的跳转,其正则表达式是基于Perl语言。通常而言,几乎所有的WEB服务器均可以支持URL重写。
Rewrite URL规则重写的用途:
  • 对搜索引擎优化(Search Engine Optimization,SEO)友好,利于搜索引擎抓取网站页面;
  • 隐藏网站URL真实地址,浏览器显示更加美观;
  • 网站变更升级,可以基于Rewrite临时重定向到其他页面。
  • Nginx Rewrite是由ngx_http_rewrite_module模块提供;
  • Nginx Rewrite可以使用正则替换URL,返回重定向页面。
  • Nginx Rewrite是按顺序进行匹配的。
  • Nginx Rewrite放在server,location,if上下文。

Nginx Rewrite规则使用中有三个概念需要理解,分别是:Rewrite结尾标识符、Rewrite规则常用表达式、Nginx Rewrite变量,如下为三个概念的详解:
Rewrite结尾标识符:由于Rewrite规则末尾,表示规则的执行属性。
  • last :相当于Apache里的(L)标记,表示完成rewrite匹配,匹配完成后还会向下继续匹配。
  • break:本条规则匹配完成后,终止匹配,不再匹配后面的规则.
  • redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址。
  • permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
其中last和break用来实现URL重写时,浏览器地址栏URL地址不变。
Rewrite规则常用表达式:要用于匹配参数、字符串及过滤设置。
[td]
符号意义
.匹配任何单个字符
[word]匹配字符串word
[^word]不匹配字符串word
aa|bb可选择字符串aa|bb
?匹配0到1个字符
*匹配0到多个字符
+匹配1到多个字符
^字符串开始标志
$字符串结尾标志
\n转义字符
Rewrite变量:常用于匹配HTTP请求头信息、浏览器主机名、URL等。
HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT;connection & request: REMOTE_ADDR, QUERY_STRING;server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL;system stuff: TIME_YEAR, TIME_MON, TIME_DAY。详解如下:HTTP_USER_AGENT         用户使用的代理,例如浏览器;HTTP_REFERER                告知服务器,从哪个页面来访问的;HTTP_COOKIE             客户端缓存,主要用于存储用户名和密码等信息;HTTP_HOST                匹配服务器ServerName域名;HTTP_ACCEPT                客户端的浏览器支持的MIME类型;        REMOTE_ADDR                客户端的IP地址QUERY_STRING                URL中访问的字符串;DOCUMENT_ROOT                服务器发布目录;SERVER_PORT                服务器端口;SERVER_PROTOCOL                服务器端协议;TIME_YEAR                年;TIME_MON                月;TIME_DAY                日;
补充: if指令:
语法:        if (condition) { ... }默认值:        —上下文:        server, location
计算指定condition的值。计算指定的condition的值。如果为真,执行定义在大括号中的rewrite模块指令,并将if指令中的配置指定给请求。if指令会从上一层配置中继承配置。
condition为下:
[td]
条件解释
变量名如何变量值为空或者以0开始的字符串,则为假
=运算符等于,则为真
!=运算符不等于,则为真
~大小写敏感,匹配变量和正则
~*大小写不敏感,匹配变量和正则
-f | !-f检查文件是否存在
-d | !-d检查目录是否存在
-e | !-e检查文件,目录或符号链接是否存在
-x | !-x检查是否是可执行文件
Nginx Rewrite案例
  • if ( $host = 'www.abc1.com' ){   rewrite ^/(.*)$ http://www.abc2.com/$1 permanent; }
  • rewrite ^/$ http://www.abc1.com/newindex.html permanent;
  • 访问/test/跳转到www.abc1.com/newindex.html
    rewrite ^/test/$ http://www.abc1.com/newindex.html permanent;
  • 多域名跳转到 www.abc1.com
    if ( $host != 'www.abc1.com' ) { rewrite ^/(.*)$  http://www.abc1.com/$1  permanent; }
  • 访问文件和目录不存在跳转至index.html。
    if ( !-e $request_filename ) { rewrite ^/(.*)$  /index.html  last; }
  • 目录对换 /xxxx/123456 ====> /xxxx?id=123456
    rewrite ^/(.+)/(\d+)  /$1?id=$2 last;
  • 判断浏览器User Agent跳转。
    if( $http_user_agent  ~ MSIE){rewrite ^(.*)$ /ie/$1 break;}
  • 禁止访问以.sh,.flv,.mp3为文件后缀名的文件。
    location ~ .*\.(sh|flv|mp3)$ {         return 403; }
  • 将移动用户访问跳转至移动端。
    if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" ) { rewrite ^/$      http://m.jfedu.net/       permanent; }
  • 匹配URL访任意字符串后面含有?tid=13就跳转,$args 表示任意字符串
    if ( $args ~* tid=13 ){ return 404;}
  • 访问/10690/jj/123跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符。
    rewrite   ^/([0-9]+)/jj/(.+)$     /index.php?tid/$1/items=$2     permanent;

真心的发现WIN8很不好用,到不是说没有开始菜单就不习惯了,关键是很多专业软件都不能再它上面运行,而且自带IE10,基本没几个网站兼容。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|常州网管员 ( 苏ICP备09009643号 )

GMT+8, 2019-11-23 02:07 , Processed in 0.015414 second(s), 7 queries , MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表