[转帖]nginx中rewrite和if的用法及配置
nginx中rewrite和if的用法及配置
一、rewrite应用
rewrite语法
rewrite <正则表达式> <跳转后的内容> [rewrite支持的flag标记]
- 1
1、rewrite跳转场景
- URL看起来更规范、合理
- 企业会将动态URL地址伪装成静态地址提供服务
- 网址换新域名后,让旧的访问跳转到新的域名上
- 服务端某些业务调整
2、rewrite实际场景
- 1.3.1 Nginx跳转需求的实现方式
使用rewrite进行匹配跳转
使用if匹配全局变量后跳转
使用location匹配再跳转 - 1.3.2 rewrite放在server{},if{},location{}段中
location只对域名后边的除去传递参数外的字符串起作用 - 1.3.3 对域名或参数字符串
使用if全局变量匹配
使用proxy_pass反向代理
3、常用的nginx正则表达式
^:匹配输入字符串的起始位置
$:匹配输入字符串的结束位置
*****:匹配前面的字符零次或多次
+:匹配前面的字符一次或多次
?:匹配前面的字符零次或一次
.:匹配除\n之外的任何单个字符 使用[.\n]可以匹配包括\n在内的任意字符
****:转义符
\d:匹配纯数字
{n}:重复n次
{n,}:重复n次或更多次
[c]:匹配单个字符c
[a-z]:匹配a-z小写字母的任意一个
[a-zA-Z]:匹配a-z小写字母或A-Z大写字母的任意一个
4、常见的flag
| flag | 作用 |
|---|---|
| last | 基本上都用这个flag,表示当前的匹配结束,继续下一个匹配,最多匹配10个到20个 一旦此rewrite规则重写完成后,就不再被后面其它的rewrite规则进行处理 而是由UserAgent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程 |
| break | 中止Rewrite,不再继续匹配 一旦此rewrite规则重写完成后,由UserAgent对新的URL重新发起请求, 且不再会被当前location内的任何rewrite规则所检查 |
| redirect | 以临时重定向的HTTP状态302返回新的URL |
| permanent | 以永久重定向的HTTP状态301返回新的URL |
last和break在重定向后,地址栏都不会发生变化,这是它们的相同点,不同点在于last会写在server和if中,break是写在location中,last不会终止重写后的url匹配,break会终止重写后的url匹配。
5、案例配置
rewrite重写flag
rewrite主要是用来重写URL或者跳转URL的指令
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
root /hhh/xxx;
location / {
rewrite /1.html /2.html;
rewrite /2.html /3.html;
}location /2.html <span class="token punctuation">{<!-- --></span>
rewrite /2.html /a.html<span class="token punctuation">;</span>
<span class="token punctuation">}</span> location /3.html <span class="token punctuation">{<!-- --></span>
rewrite /3.html /b.html<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
[root@nginx ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful[root@nginx ~]# systemctl restart nginx[root@nginx ~]# mkdir -p /hhh/xxx
[root@nginx ~]# echo "web1" > /hhh/xxx/1.html
[root@nginx ~]# echo "web2" > /hhh/xxx/2.html
[root@nginx ~]# echo "web3" > /hhh/xxx/3.html
[root@nginx ~]# echo "web a" > /hhh/xxx/a.html
[root@nginx ~]# echo "web b" > /hhh/xxx/b.html
[root@nginx ~]# curl 192.168.183.138/1.html
web b
当请求1.html时,最终会访问到web b
在location{}内部,遇到break,本location{}内以及后面的所有location{}内的所有指令都不再执行,所以至跳转到2.html访问到web2
location / {
rewrite /1.html /2.html break;
rewrite /2.html /3.html;
}
location /2.html {
rewrite /2.html /a.html;
}
location /3.html <span class="token punctuation">{<!-- --></span>
rewrite /3.html /b.html<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
[root@nginx ~]# curl 192.168.183.138/1.html
web2
在location{}内部,遇到last,本location{}内后续指令不再执行,而重写后的url会对所在的server{…}标签重新发起请求,从头到尾匹配一遍规则,哪个匹配则执行哪个。
location / {
rewrite /1.html /2.html last;
rewrite /2.html /3.html;
}
location /2.html <span class="token punctuation">{<!-- --></span>
rewrite /2.html /a.html<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
location /3.html <span class="token punctuation">{<!-- --></span>
rewrite /3.html /b.html<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
[root@nginx ~]# curl 192.168.183.138/1.html web a
二、if应用
1、if语句中的判断条件
- ==:等值比较;
- ~:与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分字符大小写;
- ~*:与指定正则表达式模式匹配时返回“真”,判断匹配与否时不区分字符大小写;
- !~:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时区分字符大小写;
- !~*:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时不区分字符大小写
2、文件及目录匹配判断
- -f, !-f:判断指定的路径是否为存在且为文件;
- -d, !-d:判断指定的路径是否为存在且为目录;
- -e, !-e:判断指定的路径是否存在,文件或目录均可;
- -x, !-x:判断指定路径的文件是否存在且可执行;
3、基于浏览器实现分离案例
if ($http_user_agent ~ Firefox) {
rewrite ^(.*)$ /firefox/$1 break;
}
if (\(http_user_agent ~ MSIE) {
rewrite ^(.*)\) /msie/$1 break;
}
if (\(http_user_agent ~ Chrome) {
rewrite ^(.*)\) /chrome/$1 break;
}
4、防盗链案例
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referers none blocked www.idfsoft.com;
if ($invalid_referer) {
rewrite ^/ http://www.idfsoft.com/403.html;
}
}
[转帖]nginx中rewrite和if的用法及配置的更多相关文章
- Nginx中root与alias的用法及区别:
Nginx中root与alias都是定义location {}块中虚拟目录访问的文件位置: 先看看两者在用法上的区别: location /img/ { alias /var/www/image/; ...
- nginx中多ip多域名多端口配置
1.Nginx中多IP配置: server { listen 80; server_name 192.168.15.7; location / { root /opt/Super_Marie; ind ...
- Nginx中rewrite实现二级域名、三级域名、泛域名、路径的重写
最常见的: 静态地址重定向到带参数的动态地址 rewrite "^(.*)/service/(.*)\.html$" $1/service.php?sid=$2 permanent ...
- nginx中rewrite flag
rewrite 正则表达式 新URI [flag]; [flag] 选项用于调控重写的行为,它的取值可能是: last:重写完成后,会停止继续处理当前区块所有属于ngx_http_rewrite ...
- NGINX中的proxy_pass和rewrite
文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/6807081.html 转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点,如 ...
- [转帖]Nginx rewrite模块深入浅出详解
Nginx rewrite模块深入浅出详解 https://www.cnblogs.com/beyang/p/7832460.html rewrite模块(ngx_http_rewrite_modul ...
- nginx中location的顺序(优先级)及rewrite规则写法
一.location正则写法 一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所 ...
- Nginx中的 location 匹配和 rewrite 重写跳转
Nginx中的location匹配和rewrite重写跳转 1.常用的Nginx正则表达式 2.location 3.rewrite 4.rewrite实例 1.常用的Nginx正则表达式: ^ :匹 ...
- Nginx中的Location和Rewrite
Nginx中的Location和Rewrite 目录 Nginx中的Location和Rewrite 一.location 1. location的分类 2. location常用的匹配规则 3. l ...
- Nginx中的rewrite指令
转自:http://www.76ku.cn/articles/archives/317 rewite.在server块下,会优先执行rewrite部分,然后才会去匹配location块server中的 ...
随机推荐
- libGDX游戏开发之游戏纹理精灵切割(十六)
libGDX游戏开发之游戏纹理精灵切割(十六) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和 ...
- Windows桌面自动化测试工具:WinAppDriver
大家好,今天给大家介绍一款Windows桌面自动化测试工具:WinAppDriver. 1.介绍 WinAppDriver是一个开源的自动化测试工具,用于测试Windows应用程序.它是一个Windo ...
- 聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(完结篇)
前言 书接上回,上回我们了解了 castle 代理的一些缺点,本文将开始操作整合 Microsoft.Extension.Dependency和Castle,以让默认的容器可以支持拦截器 我们将以进阶 ...
- 文心一言 VS 讯飞星火 VS chatgpt (158)-- 算法导论12.3 5题
五.用go语言,假设为每个结点换一种设计,属性 x.p 指向 x 的双亲,属性 x.succ 指向 x 的后继.试给出使用这种表示法的二叉搜索树 T 上 SEARCH.INSERT 和DELETE 操 ...
- kylin&CDH理论基础
Kylin&CDH理论基础 一.维度与度量 维度是观察数据的角度.比如电商的销售数据,可以从时间维度来观察,进一步细化时间和地区维度来观察. 度量是被聚合的统计值,也是聚合运算的结果.知道维度 ...
- 音视频传输协议众多, 5G时代不同业务应该如何选择?
摘要:音视频传输协议众多, 不同业务应该如何选择? RTSP.RTMP.RTP/RTC.HLS.MSS.DASH.WEBRTC.RIST.SRT:在此我们就从业务发展的视角来理解各种流媒体协议,帮助大 ...
- 一文讲述G6实现流程图绘制的常用方法
摘要:G6 是一个图可视化引擎.它提供了图的绘制.布局.分析.交互.动画等图可视化的基础能力. 本文分享自华为云社区<会用这些的api,轻松绘制流程图--antv.g6流程图入门>,作者: ...
- 教你3种Kafka的指定副本作为Leader的实现方式
摘要:因为在我们实际的运维过程中,需要指定某个副本为ISR,但是Kafka中的Leader选举策略并不支持这个功能,所以需要我们自己来实现它. 本文分享自华为云社区<Kafka的指定副本作为Le ...
- PPT 流星动画
https://www.bilibili.com/video/BV1w54y1Q7cZ?p=6 星空背景绘制 绘制矩形框 背景不再被拖动 处理前先复制一份,用于后面做激光效果 星星效果 再次组合 按S ...
- IntelliJ IDEA lombok log 报红
pom文件中引用了 lombok 插件,但Intellij 代码里仍然是红色提示,具体操作如下 Mac
