nginx中rewrite和if的使用及配置方式

 更新时间:2026年05月04日 11:13:01   作者:咖啡调调。  
文章主要解释了Nginx中rewrite和ifginx跳转需求的实现方式、rewrite和ifginx正则表达式、常用的Nginx正则表达式、案例配置等内容,并涉及到了rewrite和if的应用场景和用法,以及flag对Nginx中ginx防盗链案例等ginx的ginx基于浏览器实现ginx实现分离案例等

一、rewrite应用

rewrite语法

rewrite  <正则表达式>  <跳转后的内容>  [rewrite支持的flag标记]

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 {
                rewrite /2.html /a.html;
        }

        location /3.html {
                rewrite /3.html /b.html;
        }
        
[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 {                          
                rewrite /3.html /b.html;            
        }   
        
[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 {
                rewrite /2.html /a.html;
        }

        location /3.html {
                rewrite /3.html /b.html;
        }
        
[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+lua进行token鉴权的方法

    使用nginx+lua进行token鉴权的方法

    使用nginx和lua脚本实现对Minio服务器图片链接的token鉴权,通过反向代理隐藏真实IP,增强安全性,介绍了整个鉴权流程,包括nginx配置和lua脚本的具体实现,适用于需要保护图片不被未授权访问的场景
    2022-05-05
  • Nginx的try_files指令使用实例

    Nginx的try_files指令使用实例

    这篇文章主要介绍了Nginx的try_files指令使用实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • 银河麒麟(Kylin)离线安装Nginx并部署多服务完整步骤

    银河麒麟(Kylin)离线安装Nginx并部署多服务完整步骤

    这篇文章主要介绍了银河麒麟(Kylin)离线安装Nginx并部署多服务的相关资料,包括依赖包下载、HTTPS配置、多端口站点部署等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-02-02
  • nginx rewrite重写规则与防盗链配置方法教程详解

    nginx rewrite重写规则与防盗链配置方法教程详解

    这篇文章主要介绍了nginx rewrite重写规则与防盗链配置方法教程详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • nginx 访问限制与访问控制的实现

    nginx 访问限制与访问控制的实现

    访问控制要做的事情是控制客户端的资源访问权限,本文主要介绍了nginx 访问限制与访问控制的实现,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • Nginx如何自动封禁可疑Ip

    Nginx如何自动封禁可疑Ip

    这篇文章主要介绍了Nginx如何自动封禁可疑Ip问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • 详解Prometheus 抓取 nginx 访问日志的指标

    详解Prometheus 抓取 nginx 访问日志的指标

    通过结合NGINX Exporter, Fluentd, Prometheus和Grafana, 可有效监控并可视化NGINX中的4xx和5xx状态码日志,首先使用Fluentd收集和解析NGINX日志,再通过Prometheus抓取Fluentd暴露的指标,本文介绍Prometheus抓取nginx访问日志的指标,感兴趣的朋友一起看看吧
    2024-10-10
  • Nginx实现自签名SSL证书生成与配置实现

    Nginx实现自签名SSL证书生成与配置实现

    本文主要介绍了Nginx实现自签名SSL证书生成与配置实现,文章将详细介绍生成自签名SSL证书的步骤,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • nginx+uwsgi启动Django项目的详细步骤

    nginx+uwsgi启动Django项目的详细步骤

    nginx+uwsgi+django是我们常用的django部署方式。这篇文章主要介绍了nginx+uwsgi启动Django项目的详细步骤,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • nginx 常用指令 try_files allow root alias的使用

    nginx 常用指令 try_files allow root ali

    本文主要介绍了nginx 常用指令 try_files allow root alias的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08

最新评论