十三、将请求的URL基于正则表达式进行rewrite重写

使用Tengine提供的全局变量或自定义变量,结合正则表达式和标志位实现URL重写以及重定向,通常可以实现http跳转至https、域名1跳转至域名2URL1跳转至URL2等功能。

1、 Perl兼容正则表达式:

Ø .:匹配除换行符\n以外的任意单个字符

Ø ?:匹配之前的字符0次或1

Ø +:匹配之前的字符至少*:匹配之前的字符任意次

Ø \d:匹配数字

Ø ^:匹配字符串的开始

Ø $:匹配字符串的结尾

Ø {m}:重复m

Ø {m,}:重复至少:重复至少m次,最多n

Ø [a]:匹配单个字符a

Ø [a-z]:匹配a-z小写字母中的任意一个

Ø [^ ]:匹配任何不包括在指定字符集内的任意字符

Ø |:匹配 | 之前或之后的部分

Ø ():分组,组成一组用于匹配的实体,通常配合 | 使用。小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容


2、 if

if主要用来判断一些在rewrite语句中无法直接匹配的条件,比如检测文件存在与否

用法:if(条件) {}

Ø if表达式中的条件为true时,执行if代码块中的语句

Ø 当表达式只是一个变量时,如果值为空或者任何以0开头的字符串都会当作false

Ø 直接比较内容时,使用=!=

Ø 使用正则表达式匹配时,使用

² ~:区分大小写的模式匹配

² ~*:不区分大小写的模式匹配

² !~:区分大小写的模式不匹配

² !~*:不区分大小写的模式不匹配

Ø 使用-f-d-e-x检测文件和目录

² -f!-f用来判断文件是否存在

² -d!-d用来判断目录是否存在

² -e!-e用来判断文件和目录是否存在

² -x!-x用来判断文件是否可执行


3、 return:用来直接设置http返回状态,比如403404等。301302不可用return返回,因为301302不能简单的只返回状态码,还必须有重定向的URL


4、 break:用来立即停止rewrite检测


5、 rewrite

flag标志位

Ø last:执行该rewrite规则后,停止处理后续的rewrite指令集,对于重写后的URL会重新匹配location

Ø break:执行该rewrite指令集,不再进行location匹配

Ø redirect:重写完成之后会返回客户端302状态响应码(临时重定向),地址栏会显示跳转后的地址

Ø permanent:重写完成之后会返回客户端301(永久重定向),地址栏会显示跳转后的地址


示例1

server段中新增如下2location(没有flag):

location /aaa.html {

rewrite "^/aaa.html$" /bbb.html;

rewrite "^/bbb.html$" /ddd.html;

}

location /bbb.html {

rewrite "^/bbb.html$" /ccc.html;

}

创建测试页:

# echo "aaa html" > /usr/local/tengine/html/aaa.html

# echo "bbb html" > /usr/local/tengine/html/bbb.html

# echo "ccc html" > /usr/local/tengine/html/ccc.html

# echo "ddd html" > /usr/local/tengine/html/ddd.html

# Nginx -t # Nginx -s reload

测试:# curl http://localhost/aaa.html


示例2

locationflaglast):

rewrite "^/aaa.html$" /bbb.html last;

# curl http://localhost/aaa.html

解释:aaa.html --> bbb.html --> 由于last,所以不会将bbb.html --> ddd.html --> 重新匹配bbb.html --> ccc.html


示例3

break):

rewrite "^/aaa.html$" /bbb.html break;

break,所以不再进行location匹配


示例4

server段中新增如下代码:

rewrite "^/aaa.html$" /bbb.html;

location /ccc.html {

rewrite "^/ccc.html$" /eee.html;

rewrite "^/bbb.html$" /ccc.html;

rewrite "^/ccc.html$" /ddd.html;

# Nginx -t # Nginx -s reload

创建测试页:# echo "eee html" > /usr/local/tengine/html/eee.html

测试:

解释:首先执行server段内的rewrite指令,即aaa.html --> bbb.html --> ccc.html --> ddd.html

5

location /ddd.html {

rewrite "^/ddd.html$" /eee.html;

解释:首先执行server段内的rewrite指令,即aaa.html --> bbb.html --> ccc.html,执行结果不受rewritelocation的位置顺序影响,即location匹配迭代总是先执行rewrite指令,再进行location匹配,执行location段内的rewrite指令


6、 全局变量:

$content_lengthhttp请求头中的Content-length字段

$content_typeContent-Type字段

$document_root:当前请求在root指令中指定的值

$host:请求主机头字段,如果请求中没有Host行,则为服务器名称

$http_user_agent:客户端agent信息

$http_cookie:客户端cookie信息

$limit_rate:限制连接速率

$request_method:客户端请求方法,通常为GETPOST

$remote_addr:客户端IP地址

$remote_port:客户端端口

$remote_user:已经经过Auth Basic Module验证的用户名

$request_filename:当前请求的文件路径,由rootalias指令与URL请求生成

$scheme:请求使用的协议,比如http或者是https

$server_protocol:请求使用的协议版本,通常是HTTP/1.0HTTP/1.1

$server_addr:服务器地址,在完成一次系统调用后可以确定这个值

$server_name:服务器名称

$server_port:请求到达服务器的端口号

$request_uri:包含请求参数的原始URL,不包含主机名,如:/foo/bar.PHP?arg=baz

$uri:不带请求参数的当前URL$uri不包含主机名,如:/foo/bar.html

$document_uri:与$uri相同


7、 生产环境常见案例:

(1)禁止使用curl命令下载文件:

未配置前:# curl http://localhost/index.html

if ($http_user_agent ~ curl) {

return 403;


(2)基于浏览器实现分离:

if ($http_user_agent ~ Firefox){

rewrite ^/(.*)$ /firefox/$1 break;

if ($http_user_agent ~ MSIE){

rewrite ^/(.*)$ /msie/$1 break;

if ($http_user_agent ~ Edge){

rewrite ^/(.*)$ /edge/$1 break;

if ($http_user_agent ~ Chrome){

rewrite ^/(.*)$ /chrome/$1 break;

# mkdir -pv /usr/local/tengine/html/{firefox,msie,edge,chrome}

# echo "Firefox html" > /usr/local/tengine/html/firefox/index.html

# echo "MSIE html" > /usr/local/tengine/html/msie/index.html

# echo "Edge html" > /usr/local/tengine/html/edge/index.html

# echo "Chrome html" > /usr/local/tengine/html/chrome/index.html

# Nginx -t # Nginx -s reload

测试:

使用火狐浏览器访问:http://192.168.1.222/index.html


使用IE 9浏览器访问:Edge浏览器访问:http://192.168.1.222/index.html

备注:Windows 10中内置的浏览器为Microsoft Edge,之前为IE


使用谷歌浏览器访问:http://192.168.1.222/index.html


使用未做规则匹配的360浏览器访问:http://192.168.1.222/index.html


访问日志格式如下:

(3)实现访问http://blog.qiuyue.com时自动跳转到http://www.qiuyue.com/blog

server {

listen 80;

server_name blog.qiuyue.com;

rewrite ^/(.*)$ http://www.qiuyue.com/blog/$1 permanent;

location / {

root html/blog;

index index.html index.html;

}

}

server_name www.qiuyue.com;

root html/www;

index index.html index.html;

# mkdir -pv /usr/local/tengine/html/{blog,www/blog}

# echo "http://blog.qiuyue.com/index.html" > /usr/local/tengine/html/blog/index.html

# echo "http://www.qiuyue.com/blog/index.html" > /usr/local/tengine/html/www/blog/index.html

# Nginx -t # Nginx -s reload

修改本地Windows 10系统的hosts文件:

C:\Windows\System32\drivers\etc\hosts,末尾新增代码:

192.168.1.222 www.qiuyue.com blog.qiuyue.com

测试:

在浏览器中访问http://www.qiuyue.com/blog

回车后自动跳转:

(4)实现访问http://www.qiuyue.com/bbs时自动跳转到http://bbs.qiuyue.com

listen 80;

server_name www.qiuyue.com;

rewrite ^/bbs/(.*)$ http://bbs.qiuyue.com/$1 permanent;

location / {

root html/www;

index index.html index.html;

}

server_name bbs.qiuyue.com;

root html/bbs;

# mkdir -pv /usr/local/tengine/html/{bbs,www/bbs}

# echo "http://bbs.qiuyue.com/index.html" > /usr/local/tengine/html/bbs/index.html

# echo "http://www.qiuyue.com/bbs/index.html" > /usr/local/tengine/html/www/bbs/index.html

192.168.1.222 www.qiuyue.com bbs.qiuyue.com

测试:

在浏览器中访问http://bbs.qiuyue.com

(5)实现访问qiuyue.com时自动跳转到www.qiuyue.com

server_name qiuyue.com;

rewrite ^/(.*)$ http://www.qiuyue.com/$1 permanent;

root html;

server_name www.qiuyue.com;


192.168.1.222 qiuyue.com www.qiuyue.com

测试:

在浏览器中访问www.qiuyue.com

(6)实现访问http://www.aaa.com时自动跳转到http://www.bbb.com

server_name www.aaa.com;

rewrite ^/(.*)$ http://www.bbb.com/$1 permanent;

root html/aaa;

}


server_name www.bbb.com;

root html/bbb;

# mkdir -pv /usr/local/tengine/html/{aaa,bbb}

# echo "http://www.aaa.com/index.html" > /usr/local/tengine/html/aaa/index.html

# echo "http://www.bbb.com/index.html" > /usr/local/tengine/html/bbb/index.html

192.168.1.222 www.aaa.com www.bbb.com

测试:

在浏览器中访问http://www.bbb.com

回车后自动跳转:

CentOS 7.4 Tengine安装配置详解四的更多相关文章

  1. HTML实现代码雨源码及效果示例

    这篇文章主要介绍了HTML实现代码雨源码及效果示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. HTML文本属性&颜色控制属性的实现

    这篇文章主要介绍了HTML文本属性&颜色控制属性的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. 简洁自适应404页面HTML好看的404源码

    这篇文章主要介绍了简洁自适应404页面HTML好看的404源码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. HTML5适合的情人节礼物有纪念日期功能

    这篇文章主要介绍了HTML5适合的情人节礼物有纪念日期功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 如何给HTML标签中的文本设置修饰线

    这篇文章主要介绍了如何给HTML标签中的文本设置修饰线,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  6. HTML5调用手机发短信和打电话功能

    这篇文章主要介绍了HTML5调用手机发短信和打电话功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  7. HTML利用九宫格原理进行网页布局

    这篇文章主要介绍了HTML利用九宫格原理进行网页布局,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. HTML中实现音乐或视频自动播放案例详解

    由于期末大作业我想插入一个背景音乐,实现点开网页就会自动播放音频的效果,今天通过本文给大家分享下我基于HTML实现音乐或视频自动播放功能,代码简单易懂,需要的朋友参考下吧

  9. 使用HTML5加载音频和视频的实现代码

    这篇文章主要介绍了使用HTML5加载音频和视频的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  10. html svg生成环形进度条的实现方法

    这篇文章主要介绍了html svg生成环形进度条的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部