Nginx Location和Rewrite深入剖析(2)

Rewrite规则常用表达式:要用于匹配参数、字符串及过滤设置。

符号意义
.   匹配任何单个字符  
[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为下:

条件解释
变量名   如何变量值为空或者以0开始的字符串,则为假  
=   运算符等于,则为真  
!=   运算符不等于,则为真  
~   大小写敏感,匹配变量和正则  
~*   大小写不敏感,匹配变量和正则  
-f | !-f   检查文件是否存在  
-d | !-d   检查目录是否存在  
-e | !-e   检查文件,目录或符号链接是否存在  
-x | !-x   检查是否是可执行文件  

Nginx Rewrite案例

1.将 跳转到

if ( $host = 'www.abc1.com' ){    rewrite ^/(.*)$ $1 permanent;  }

2.访问跳转

rewrite ^/$ permanent;

3.访问/test/跳转到

rewrite ^/test/$ permanent;

4.多域名跳转到

if ( $host != 'www.abc1.com' ) {  rewrite ^/(.*)$  $1  permanent;  }

5.访问文件和目录不存在跳转至index.html。

if ( !-e $request_filename )  {  rewrite  ^/(.*)$  /index.html  last;  }

6.目录对换 /xxxx/123456 ====> /xxxx?id=123456

rewrite ^/(.+)/(\d+)  /$1?id=$2 last;

7.判断浏览器User Agent跳转。

if( $http_user_agent  ~ MSIE) { rewrite ^(.*)$ /ie/$1 break; }

8.禁止访问以.sh,.flv,.mp3为文件后缀名的文件。

location ~ .*\.(sh|flv|mp3)$  {  return 403;  }

9.将移动用户访问跳转至移动端。

if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" )  {  rewrite ^/$            permanent;  }

10.匹配URL访任意字符串后面含有?tid=13就跳转,$args 表示任意字符串

if ( $args ~* tid=13 ){  return 404; }

11.访问/10690/jj/123跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符。

rewrite  ^/([0-9]+)/jj/(.+)$    /index.php?tid/$1/items=$2    permanent;

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8a527639c9adcc923d40bcbfbf5b4767.html