rewirte
规则也称为规则重写,主要功能是实现浏览器访问HTTP URL
的跳转,其正则表达式是基于Perl
语言。通常而言,几乎所有的Web
服务器均可以支持URL
重写。rewrite URL
规则重写的用途如下:
- 对搜索引擎优化(
search engine optimization,SEO
)友好,利于搜索引擎抓取网站页面;- 隐藏网站
URL
真实地址,浏览器显示更加美观;- 网站变更升级,可以基于
rewrite
临时重定向到其他页面。
Nginx rewrite
规则使用中有3个概念,分别是rewrite
结尾标识符、rewrite
规则常用表达式、Nginx rewrite
变量,3个概念的详解如下:
Nginx rewrite
结尾标识符,用于rewrite
规则末尾,表示规则的执行属性,详解如下:
last
:相当于Apache里的L
标记,表示完成rewrite
匹配
break
:本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect
:返回302
临时重定向,浏览器地址会显示跳转后的URL
地址
permanent
:返回301
永久重定向,浏览器地址栏会显示跳转后的URL
地址其中last和break用来实现URL重写时,浏览器地址栏URL地址不变。
Nginx rewrite
规则常用表达式,主要用于匹配参数、字符串及过滤设置,详解如下:
.
:匹配任何单字符[word]
:匹配字符串word[^word]
:不匹配字符串wordtrumanwl|matting
:可选择的字符串trumanwl|matting
?
:匹配0~1个字符∗
:匹配0到多个字符+
:匹配1到多个字符^
:字符串开始标志$
:字符串结束标志\n
:转义符标志
Nginx 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
:日
以下展示一些Nginx rewrite
常见案例:
- 将
trumanwl.com
跳转至www.trumanwl.com
,代码如下:if ($host = 'trumanwl.com') { rewrite ^/(.*)$ https://www.trumanwl.com/$1 permanent; }
- 访问
/blog/1
跳转至/newindex.html
,浏览器地址不变,代码如下rewrite ^/blog/1$ /newindex.html last;
- 多域名跳转到
www.trumanwl.com
,代码如下:if ($host != 'www.trumanwl.com') { rewrite ^/(.*)$ https://www.trumanwl.com/$1 permanent; }
- 访问文件和目录不存在跳转至
index.php
,代码如下:if (! -e $request_filename) { rewrite ^/(.*)$ /index.php last; }
- 目录对换
/xxxx/123
=>/xxxx?id=123
,代码如下:rewrite ^/(.+)/(\d+) /$1?id=$2 last;
- 判断浏览器user agent跳转,代码如下:
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /ie/$1 break; }
- 禁止访问以
.sh
、.sql
、.env
为文件后缀名的文件,代码如下:location ~ .*\.(sh|sql|env)$ { return 403; }
- 将移动用户访问跳转至移动端,代码如下:
if ($http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)") { rewrite ^(.*)/$ https://m.trumanwl.com/ permanent; }
- 匹配
URL
访问字符串跳转,代码如下:if ($args ~* id=1) { return 403; }
- 访问
/1/comment/1
跳转至/index.php?id/1/comment_id=1
,[0-9]
表示任意一个数字,+
表示多个,(.+)
表示任何多个字符,代码如下:rewrite ^/([0-9])/comment/(.+)$ /index.php?id/$1/comment_id=$2 last;