当前位置: 首页 > news >正文

当Nginx遇到重定向

作为一款Web服务器软件,Nginx实现了Web服务器的基本功能,用户通过简单的配置指令就可以快速完成Web服务器的搭建。它还是网络通信协议处理软件,支持TCP/UDP、HTTP、HTTP/2、gRPC、FastCGI、SCGI、uWSGI、WebDAV等协议的处理,并实现了相应通信协议的请求解析、长连接、代理转发、负载均衡、会话保持等互联网架构中常见的应用功能。同时,它还是一款高并发服务软件,其采用的固定数量的多进程模型、事件驱动处理机制、工作流处理方式及模块化架构等软件开发设计,已成为高并发服务软件开发的典范。

重定向,通常是指URL重定向,也称为URL转发。是指在原链接的地址变更且不想影响搜索排名或执行任务异步显示等场景时,将原链接的访问的新地址发送给客户端并重新发起请求的访问方式。Nginx在作为代理服务器应用中,经常会遇到被代理服务器返回URL重定向的场景。本文主要介绍Nginx重定向方式。

01

重定向方式

客户端重定向比较常用的有如下有2种实现方式,分别是HTTP协议的响应状态码和HTML的元信息标签。

基于HTTP协议的重定向

HTTP协议中,由服务器端发送特殊的响应状态码来触发浏览器客户端实现重定向,HTTP协议的响应状态码为3xx,常用的有如下几个状态码:

状态码

应用场景

处理方法

说明

301

永久重定向

GET、HEAD

重定向的HTTP方法为GET

308

永久重定向

ALL

重定向的HTTP方法取决于第一次访问的HTTP方法

302

临时重定向

GET、HEAD

重定向的HTTP方法为GET

303

临时重定向

GET、HEAD

重定向的HTTP方法为GET

307

临时重定向

ALL

重定向的HTTP方法取决于第一次访问的HTTP方法

重定向的URL地址由响应头字段“Location”的属性定义。

基于HTML的元信息标签的重定向

在一些场景中,由于开发人员没有Web服务器的配置权限,所以会利用Html元信息标签提供的“http-equiv”属性来实现重定向,该属性可以定义响应头的信息,如响应体内容编码、当前内容浏览器缓存方式、页面跳转、网站内容描述等常见HTTP响应头字段属性信息。配置格式如下所示:

<meta http-equiv="属性字段" content="属性字段值">

页面重定向的属性字段为“Refresh”。当显示页面时,浏览器会检测该属性并重定向到指定的url地址,配置方式如下:

<meta http-equiv="Refresh" content="2"; URL="http://www.nginxbar.com/">

客户端浏览器2秒后自动重定向到指定的URL: http://www.nginxbar.com

执行优先级

上述两种方式的执行优先级会因浏览器客户端的不同有一定差异,大多数浏览器客户端会遵循HTTP协议的重定向机制最先触发,HTML的元信息标签会在HTTP协议的重定向机制未设置的情况下触发。

02

Nginx的重定向处理

Nginx 提供了多个配置指令可以灵活的处理被代理服务器中的URL重定向响应,通常被分为两种方法,一种是Nginx将被代理服务器的URL重定向返回给客户端,由客户端进行处理,见实例一、二。第二种方式是Nginx处理URL重定向后将最终的结果返回给客户端,见实例三。

实例一:状态码转发

在向统一网关迁移时,由于被代理的服务器多数会配有原有域名,为保持原有用户访问方式不变,所以可使用Nginx将后端服务的URL重定向进行url替换,实现平滑迁移。

配置样例

location /api/ {
    proxy_pass http://backend;
    # 修改被代理服务器种响应头“Location”字段的内容为新的域名
    proxy_redirect ~^/(.*) http://$http_host/api/$1;
}

实例二:HTML元信息标签的修改

对部分使用HTML元信息标签定义URL重定向的网站,可以使用Nginx配置指令将原有的域名替换为新的域名。

配置样例

location /books {
    # 设置请求头,像后端请求无压缩的响应数据
    proxy_set_header Accept-Encoding '';
    proxy_pass http://www.nginxbar.com;


    # 进替换一次
    sub_filter_once on;
    # 将http://www.nginxbar.com/ 替换 为http://www.nginxbar.org/books
    sub_filter '<meta http-equiv="Refresh" content="2"; URL="http://www.nginxbar.com/">' '<meta http-equiv="Refresh" content="2";URL="http://www.nginxbar.org/books">';
}

实例三:获取重定向的真实内容

对于某些应用场景中,为提高访问效率,Nginx会直接将302的重定向在服务端处理,并将最终的结果返回给客户端。

配置样例

server {
    listen 8099;
    resolver 114.114.114.114 valid=30s;
    # Nginx处理状态码大于300的响应结果
    proxy_intercept_errors on;
    # 启用多级错误跳转
    recursive_error_pages on;
    location ~ /proxy {
        proxy_pass http://backend;
        error_page 301 302 307 308 = @error_page_302;
    }


    location @error_page_302 {
        set $new_redirect_location '$upstream_http_location';
        proxy_pass $new_redirect_location;
        # 支持多层3XX跳转
        error_page 301 302 307 = @error_page_302;
    }
}

Nginx 提供了内置变量 “$upstream_http_<响应头字段名>” 可获取响应头字段属性值

@error_page 是内部循环,最大循环次数为10次。

 

想了解更多Nginx技能,可参考《Nginx应用与运维实战》一书。

 

《Nginx应用与运维实战》是一部基于Nginx新版本和云原生应用场景系统讲解Nginx的著作,是作者十余年运维经验的总结。本书从应用、运维以及与Kubernetes和微服务集成3个维度对Nginx的基础知识、工作原理、核心应用、运维管理、集成扩展等重点内容进行了全面、细致的讲解。完全以实战为导向,包含大量的配置案例和示例代码,能帮助读者快速掌握并在实际工作中熟练应用Nginx。

第一部分 Nginx介绍

首先,简要分析了Nginx的架构特点及实现原理;其次,讲解了Nginx及其衍生版本Tengine、OpenResty的编译与部署;接着,全面介绍了Nginx的核心配置指令;最后,讲解了动态赋值、访问控制和数据处理这3个Nginx的HTTP功能模块配置指令。

第二部分 应用实战

分别介绍Nginx 在Web服务、代理服务、缓存服务和负载均衡等方面的应用实战,对于所涉及的每个模块,不仅详细分析了相关的技术特点,还给出了具体的配置指令和配置样例。

第三部分 运维管理

首先介绍Nginx的日志配置及基于ELK的日志分析,其次讲解Nginx 的状态监控配置,以及如何利用监控工具Prometheus、Zabbix实现对Nginx的监控管理;最后介绍如何基于LVS、Keepalived搭建Nginx集群负载均衡架构,以及如何结合Jenkins、GitLab和Ansible快速搭建Web化的Nginx集群配置管理框架。

第四部分 Nginx与Kubernetes和微服务的应用集成

分别介绍Nginx在Kubernetes、微服务架构中的应用,包括在Kubernetes中Nginx Ingress 的部署、管理与配置,以及基于OpenResty的开源微服务网关软件Kong的部署与应用。

 

点击链接了解详情并购买

 

更多精彩回顾

书讯 |10月书讯(下)| 双节同庆,读书正当时

书讯 |10月书讯(上)| 双节同庆,读书正当时

资讯 |DB-Engines 10月数据库排名:“三大王”无人能敌,PostgreSQL紧随其后

上新 | 百度官方出品 | 全面解读PaddlePaddle,零基础快速入门深度学习
书单 | 开学季——计算机专业学生必读的10本畅销经典

干货 | 数据分析必读干货:简单而实用的3大分析方法

收藏 | (万字长文)Spring的核心知识尽揽其中

视频 | 大佬出镜推荐不可不读系列——程序员陈彼得

赠书 | 【第27期】10本网络安全方向好书,让你挑花眼...

点击阅读全文购买

相关文章:

  • “深入浅出”《Head First Kotlin程序设计》
  • RPA的总成本和总收益分析
  • 前端音视频之WebRTC初探
  • 如何成为一名优秀的策略产品经理
  • 【超干】用户画像产品化涵盖的功能模块以及应用场景
  • WebAssembly前世今生
  • 【独家现场】2020国际金融科技论坛
  • 【第28期】10本精选大数据好书等你来选
  • 11月书讯(上)| 这些好书必须“买买买”!
  • NLP入门干货:手把手教你3种中文规则分词方法
  • 最新!数字人民币横空出世,5万深圳人瓜分1000万红包!
  • 华为的数字化转型与数据治理
  • “银杏书”带你深入理解信息产业之“魂”
  • Python代码如何敲得优雅又漂亮,这本书你必须拥有
  • Python 标准库实践之合并字典组成的列表
  • [译]如何构建服务器端web组件,为何要构建?
  • 0基础学习移动端适配
  • Asm.js的简单介绍
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • GitUp, 你不可错过的秀外慧中的git工具
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JS字符串转数字方法总结
  • php中curl和soap方式请求服务超时问题
  • Python实现BT种子转化为磁力链接【实战】
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 番外篇1:在Windows环境下安装JDK
  • 关于springcloud Gateway中的限流
  • 汉诺塔算法
  • 技术发展面试
  • 检测对象或数组
  • 简析gRPC client 连接管理
  • 听说你叫Java(二)–Servlet请求
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 赢得Docker挑战最佳实践
  • 选择阿里云数据库HBase版十大理由
  • ​secrets --- 生成管理密码的安全随机数​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #Java第九次作业--输入输出流和文件操作
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #图像处理
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (04)odoo视图操作
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (Note)C++中的继承方式
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (篇九)MySQL常用内置函数
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (五)关系数据库标准语言SQL
  • (一)kafka实战——kafka源码编译启动
  • (一)RocketMQ初步认识
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .java 9 找不到符号_java找不到符号
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Micro Framework 4.2 beta 源码探析