【linux|Web服务(08)——Nginx的Rewrite】
文章目录
- Web服务(08)——Nginx地址重写Rewrite
-
- 前言
- 一、Rewrite的简介和作用场景
- 二、Rewrite的跳转实现
- 三、Rewrite的语法格式
-
- 四种flag
- nginx中常用正则表达式regex
- rewrite的执行顺序
- 四、Rewrite实例
-
- 1.基于域名的跳转
- 2.基于客户端IP访问的跳转
- 3.基于旧域名跳转到新域名后面加目录
- 4.基于参数匹配的跳转
- 5.基于目录下所有php结尾的文件跳转
- 6.基于最普通一条url请求的跳转
Web服务(08)——Nginx地址重写Rewrite 前言 什么是Rewrite?Rewrite对称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他URL的过程。
一、Rewrite的简介和作用场景 ? URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。比如:www.123.com/index.php?id=123使用URL Rewrite转换后可以显示为www.123.com/123.html
? 对于追求完美主义的网站设计师,就算是网页的地址也常望看起来尽量简洁明快。理论上,搜索引擎更喜欢静态页面形式的网页,搜索引擎对静态页面的评分一般要高于动态页面。所以,Url Rewrite可以让我们网贴的网页更容易被搜索引擎所收录。
? 从安全角度上讲,如果在URL中暴露太多的参数,无凝会造成一定量的信息泄漏,可能会被一些黑客利用,对你的系统造成一定的破坏,所以静态化的UL地址可以给我们带来更高的安全性。
? 实现网站地址姚转,例如用户访问360buy.com,将其跳转到jd.com。例如当用户访问taobao.com的80端口时,将其就转到443端口。
总结来说Rewrite的功能就是:使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
二、Rewrite的跳转实现 ? Nginx:通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。
? 跳转:从一个location跳转到另一个location,循环最多可执行10次,吵过后nginx将返回500错误码。
? PCRE支持:perl兼容正则表达式的语法规则匹配。
? 重写模块set指令:创建新的变量并赋值。
文章图片
三、Rewrite的语法格式 ?
rewrite [flag]
? regex:表示正则匹配规则。
? replacement:表示跳转后的内容。
? flag:表示rewrite支持的flag标记。
四种flag
flag | 作用 |
---|---|
last | 停止所有rewrite相关指令,然后使用新的URL进行匹配;一般用在server和if中。(停止当前这个请求,并根据rewritel匹配的规则重新发起一个请求。新请求又从第一阶段开始执行) |
break | 停止所有rewrite相关指令,和last不同的是,last接着继续使用新的URl匹配location。而break则是直接使用当前的URl进行请求处理,能避免重复rewrite;一般用在location中 |
redirect | 返回302临时重定向,浏览器地址栏会显示跳转后的URL地址 |
permanent | 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 |
nginx中常用正则表达式regex
字符 | 描述 |
---|---|
. | 匹配除换行符以外的任意字符 |
? | 匹配前面的字符零次或一次 |
+ | 匹配前面的字符一次或多次 |
* | 匹配前面的字符0次或多次 |
\d | 匹配一个数字字符。相当于[0-9] |
\ | 转义符 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
{n} | 匹配前面的字符n次 |
{n,} | 匹配前面的字词n次或更多次 |
[c] | 匹配单个字符c |
[a-z] | 匹配小写字母的任意一个 |
rewrite的执行顺序
1.执行server块里而的rewrite指令。
2.执行location匹配。
3.执行选定的location中的rewrite指令。
使用regex匹配URI,并将匹配到的URI替换成新的URI(replacement)。如果有多个rewrite,执行顺序是从上到下依次执行,匹配到一个后匹配并不会终止,会继续匹配下去,直到返回最后一个匹配为止。如果想中途终止,则需要设置f1ag参数。
当然上面说的都是重写URI,如果placement中包含了任何协议相关,如:http://和https://,则请求就直接返回302重定向终止了。
当然,浏觉器在接收到30x的状态码后,会再度根据这个返回去请求rewrite之后的地址,最终得到所要的结果。如果不是30x的状态码,则属于nginx件内部跳转,浏览器不需要再度发起请求。
四、Rewrite实例 1.基于域名的跳转
例:旧的域名有业务需求变更,需要使用新域名代替,但是旧域名不能弃用,需要跳转到新域名上,而且后面的参数保持不变。
vim /usr/local/nginx/conf/nginx.conf
server {
listen80;
server_namewww.demo.com;
#域名修改 charset ntf-8;
#识别中文 access_loglogs/www.demo.com-.access.log;
#日志修改location / {
#添加域名和重定向
if ($host = 'www.demo.com'){
#$host为rewrite全局变量,代表请求主机头字段或主机名
rewrite ^/(.*)$ http://www.demottt.com/$1 permanent;
#$1为正则匹配的内容,即“域名/”之后的字符串,这里就是(.*)$
}
roothtml;
indexindex.html index.htm;
}
配置完成后验证,可以去windows主机中的hosts文件通过记事本打开添加dns解析:
文章图片
验证在浏览器输入模拟访问http://www.demo.com/index.html是否会跳转到www.demottt.com/index.html:
文章图片
2.基于客户端IP访问的跳转
例如:要求所有IP访问任何内容都显示一个固定的维护页面,除内部IP才能正常访问。
vim /usr/local/nginx/conf/nginx.conf
server {
listen80;
server_namewww.demo.com;
#域名修改 charset ntf-8;
#识别中文 access_loglogs/www.demo.com-.access.log;
#日志修改
#设置是否合法的IP标记
set $rewrite true;
#设置变量rewrite,变量值为布尔值ture
#判断是否为合法IP
if ($remote_addr = "192.168.222.128") {
#当客户端IP为192.168.222.128时,将变量值设为false,不进行重写
set $rewrite false;
}
#除了合法IP,其他都是非法IP,进行重写跳转维护页面
if ($rewrite = ture) {#当变量值为true时
rewrite (.+) /wehui.html;
#将域名后面的路径重写成/weihu.html
}location = /weihu.html {
root /var/www/html;
#网页返回/var/html/weihu.com的内容
}location / {
roothtml;
indexindex.html index.htm;
}
#创建维护网页存放目录
[root@TTTTTTT ~]# mkdir -p /var/www/html/
#编译正在维护的页面
[root@TTTTTTT ~]# echo "It is not work" > /var/www/html/weihu.html
#平滑重新加载nginx服务
[root@TTTTTTT ~]# nginx -s reload
重新登陆一个不同IP的主机:
文章图片
登陆192.168.222.128网址查看是否被拦截:
文章图片
3.基于旧域名跳转到新域名后面加目录
例如:现在访问的是http://bbs.demo.com/post/,现在需要将这个域名下面的范根都跳转到http://www.demo.com/bbs/post
vim /usr/local/nginx/conf/nginx.conf
server {
listen80;
server_name bbs.demo.com;
chaterutf-8;
access_log /var/log/nginx/www.demo.com-access.log;
}
location /post {
rewrite (.+http://www.demo.com/bbs$1 permanent;
#这里的$1为位置变量,代表/post
}
location /{
root html;
index index.html index.htm;
}
[root@TTTTTTT ~]# mkdir -p /usr/local/nginx/html/bbs/post
[root@TTTTTTT ~]# echo "this is 1.html">/usr/local/nginx/html/bbs/post/1.html
[root@TTTTTTT ~]# echo "192.168.10.19 bbs.kgc.com">>/etc/hosts
[root@TTTTTTT ~]# nginx -s reload
使用浏览器访问bbs.kgc.com/post/1.html跳转到www.kgc.com/bbs/post/1.html。
4.基于参数匹配的跳转
例:现在访问http://www.demo.com/100-(100|200)-100.html跳转到http://wwww.demo.com页面。
vim /usr/local/nginx/conf/nginx.conf
server
listen 80;
server name www.demo.com;
#域名修改
charset utf-8;
access log /var/log/nginx/www.demo.com-access.log;
if($request uri ~ ^/100-(100|200)-(\d+).html$){
rewrite (.+http://www.demo.com permanent;
location / {
root html;
index index.html index.htm;
}
#$request uri:包含请求参数的原始URI,不包含主机名,如:http://www.kgc.com/abc/bbs/index.html?a=1&b=2/abc/bbs/index.php?a=18b=2
#uri:这个变量指当前的请求URI,不包括任何参数,如:/abc/bbs/index.html
#$document uri:与$uri相同,这个变量指当前的请求URI,不包括任何传递参数,如:/abc/bbs/index.html
5.基于目录下所有php结尾的文件跳转
例:访问www.demo.com/upload/index.php跳转www.demo.com。
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server name www.demo.com;
#域名修改
charset utf-8:
access_log /var/log/nginx/www.demo.com-access.log;
location ~/upload/.*\.php$ {
rewrite (.+) http://www.demo.com permanent;
} location / {
root html;
index index.html index.htm;
}
}
6.基于最普通一条url请求的跳转
例:要求访问一个具体的页面如www.demo.com/abc/123.html。
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server name www.demo.com;
#域名修改
charset utf-8:
access_log /var/log/nginx/www.demo.com-access.log;
location ~* ^/abc/123.html {
rewrite (.+) http:/www.demo.com permanent;
}
if (Srequest_uri ~ ^/abc)location / {
root html;
index index.html index.htm;
}
}
END
推荐阅读
- 服务器运维|LNMP详解(八)——Nginx动静分离实战配置
- linux|IP地址荷官——DHCP(动态主机配置协议)简介
- linux|Web服务(05)——Nginx的简介和安装
- nginx|Web服务(08)——Nginx的Rewrite
- linux|ROS中catkin_make的OpenCV冲突的解决(踩坑小记,报错分析)
- 树莓派|树莓派镜像制作
- docker|跟拐友们讲讲docker compose的用法
- docker|Docker -------harbor 私有仓库概述及构建
- 学习|k8s的安装-单master、多node