转载:https://blog.csdn.net/kiyoometal/article/details/90698761

重定向原理

  1. HTTP 协议的重定向响应的状态码为 3xx 。浏览器在接收到重定向响应的时候,会采用该响应提供的新的 URL ,并立即进行加载;
    大多数情况下,除了会有一小部分性能损失之外,重定向操作对于用户来说是不可见的。
  1. 不同类型的重定向映射可以划分为三个类别:永久重定向、临时重定向和特殊重定向。

重定向的目的

1、相似域名

浏览者可能输入错误的域名,如:gooogle.com或googel.com。机构或团体不时会注册这些拼字不正确的网域名,重定向到正确地方:google.com。例如:example.com和example.net两者均会重定向至像是example.org的单一网域或网页。

2、移动网站至新网域

  • 网站需要改变它的域名。
  • 作者移动他/她的网页至新域名。
  • 2个网站结合。

3、重定向方式

1、设定重定向映射
  • 300=Multiple Choices
  • 301=Moved Permanently
  • 302=Found
  • 303=See Other
  • 304=Not Modified
  • 305=Use Proxy
  • 306=(Unused)
  • 307=Temporary Redirect

其中以301、302、307最为常见,301代表永久转址,对于搜索引擎判定页面改变有直接影响,302代表暂时转址,通常用于页面暂时修改,之后会在恢复网址时使用。在搜索引擎优化上,将错误的302转址改成301转址对网站排名有相当作用。

2、借助 HTML 的 meta 元素的 HTML 重定向机制

例子:

  1. <head>
  2. <meta http-equiv="refresh" content="0;URL=http://www.example.com/" />
  3. </head>

content 属性的值开头是一个数字,指示浏览器在等待该数字表示的秒数之后再进行跳转。建议始终将其设置为 0 来获取更好的可访问性

显然,该方法仅适用于 HTML 页面(或类似的页面),然而并不能应用于图片或者其他类型的内容。

  1. 注意这种机制会使浏览器的回退按钮失效:可以返回含有这个头部的页面,但是又会立即跳转。
3、借助 DOM 的 JavaScript 重定向机制
  1. window.location = "http://www.example.com/";

与 HTML 重定向机制类似,这种方式并不适用于所有类型的资源,并且显然只有在支持 JavaScript的客户端上才能使用。另外一方面,它也提供了更多的可能性,比如在只有满足了特定的条件的情况下才可以触发重定向机制的场景。

三种重定向方法的优先级

由于存在上述三种 URL 重定向机制,那么在多种方法同时设定的情况下,哪种方法会首先起作用呢?优先级顺序如下:

1、HTTP 协议的重定向机制永远最先触发,即便是在没有传送任何页面——也就没有页面被(客户端)读取——的情况下。

2、HTML 的重定向机制 () 会在 HTTP 协议重定向机制未设置的情况下触发。
3、JavaScript 的重定向机制总是作为最后诉诸的手段,并且只有在客户端开启了 JavaScript 的情况下才起作用。

任何情况下,只要有可能,就应该采用 HTTP 协议的重定向机制,而不要使用 meta 标签。假如开发人员修改了 HTTP 重定向映射而忘记修改 HTML 页面的重定向映射,那么二者就会不一致,最终结果或者出现无限循环,或者导致其他噩梦的发生。

重定向的应用场景

有以下几种应用场景可以使用重定向机制,但是需要注意应该尽可能地限制其使用数量,因为每一次重定向都会带来性能上的开销。

在以下几种情况下可以使用域名别称:

1、扩大站点的用户覆盖面。一个常见的场景是,假如站点位于 www.example.com 域名下,那么通过 example.com 也应该可以访问到。这种情况下,可以建立从 example.com 的页面到 www.example.com 的重定向映射。此外还可以提供常见的同义词,或者该域名容易导致的拼写错误的域名别称。

2、迁移到另外一个域名。例如,公司改名后,你希望用户在搜索旧名称的时候,依然可以访问到应用了新名称的站点。

3、强制使用 HTTPS 协议。对于 HTTP 版本站点的请求会被重定向至采用了 HTTPS 协议的版本。

4、对于耗时请求的临时响应:一些请求的处理会需要比较长的时间,比如有时候 DELETE 请求会被安排为稍后处理。在这种情况下,会返回一个 303 (See Other) 重定向响应,该响应链接到一个页面,表示请求的操作已经被列入计划,并且最终会通知用户操作的进展情况,或者允许用户将其取消。

5、对于不安全请求的临时请求:不安全(Unsafe)请求会修改服务器端的状态,应该避免用户无意的重复操作。一般地,你并不想要你的用户重复发送 PUT、POST 或 DELETE 请求。假如你仅仅为该类请求返回响应的话,简单地点击刷新按钮就会(可能会有一个确认信息)导致请求的重复发送。

在这种情况下,服务器可以返回一个 303 (See Other) 响应,其中含有合适的响应信息。如果刷新按钮被点击的话,只会导致该页面被刷新,而不会重复提交不安全的请求。

在通用服务器中配置重定向

apache
重定向映射可以在服务器的配置文件中设置,也可以在每一个文件目录的 .htaccess 文件中设置。

mod_alias 模块提供了 Redirect 和 Redirect_Match 两种指令来设置 302 响应(默认值):

  1. <VirtualHost *:80>
  2. ServerName example.com
  3. Redirect / http://www.example.com
  4. </VirtualHost>

URL http://example.com/ 会被重定向至 http://www.example.com/ (而不是http://example.com/other.html )。

Redirect_Match 指令的功能与之类似,不同之处在于它可以通过正则表达式来指定一批受影响的 URL :

  1. RedirectMatch ^/images/(.*)$ http://images.example.com/$1

位于 images/ 文件夹下的所有文档都会被重定向至新的域名。

如果你不想要设置临时跳转,那么可是使用额外的参数(使用 HTTP 状态码或者 permanent 关键字)来进行设置:

  1. Redirect permanent / http://www.example.com
  2. Redirect 301 / http://www.example.com

mod_rewrite 模块也可以用来设置重定向映射。它应用起来更灵活,但也更加复杂。

nginx
在 Nginx 中,你可以创建一个服务器模块来进行重定向设置:

  1. server {
  2.  
  3. listen 80;
  4. server_name example.com;
  5. return 301 $scheme://www.example.com$request_uri;
  6. }

可以使用 rewrite 指令来针对一个文件目录或者一部分页面应用重定向设置:

  1. rewrite ^/images/(.*)$ http://images.example.com/$1 redirect;
  2. rewrite ^/images/(.*)$ http://images.example.com/$1 permanent;

IIS
在 IIS 中,你可以使用 元素来配置重定向映射

重定向循环

当后续的重定向路径重复之前的路径的时候,重定向循环就产生了。换句话说,就是陷入了无限循环当中,不会有一个最终的页面返回。

大多数情况下,这属于服务器端错误。如果服务器检测不到,就会返回 500 Internal Server Error 。假如你在修改了服务器配置不久就出现了这个问题,八成是遇到了重定向循环。

有时候,服务器端无法对其进行检测:重定向循环发生于多台服务器之间,对于每一台服务器来说,都无法获得一个全景图。在这种情况下,浏览器会负责进行检测,然后返回错误信息。

浅谈URL重定向的更多相关文章

  1. 浅谈输入输出”重定向“——基于Linux系统

    前言 进程在启动后会自动的打开3个文件:标准输入.标准输出和标准错误输出分别对应文件描述符0.1.2.对于每个进程他们都都维护了一张文件描述符表(file descriptor table),通常fd ...

  2. 浅谈URL跳转与Webview安全

    学习信息安全技术的过程中,用开阔的眼光看待安全问题会得到不同的结论. 在一次测试中我用Burpsuite搜索了关键词url找到了某处url,测试一下发现waf拦截了指向外域的请求,于是开始尝试绕过.第 ...

  3. URL跳转与webview安全浅谈

    URL跳转与webview安全浅谈 我博客的两篇文章拼接在一起所以可能看起来有些乱 起因 在一次测试中我用burpsuite搜索了关键词url找到了某处url我测试了一下发现waf拦截了指向外域的请求 ...

  4. jsp内置对象浅谈

    jsp内置对象浅谈 | 浏览:1184 | 更新:2013-12-11 16:01 JSP内置对象:我们在使用JSP进行页面编程时可以直接使用而不需自己创建的一些Web容器已为用户创建好的JSP内置对 ...

  5. 浅谈 Requests包

    浅谈 Requests包 一:Requests包是做什么的? 简单地说,是用python处理HTTP的一个包. 它的标志也非常有气质,是一个双蛇杖,按照官方的说法,一条蛇代表client,一条代表se ...

  6. 【ASP.NET MVC系列】浅谈ASP.NET MVC八大类扩展(上篇)

    lASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操 ...

  7. 浅谈RESTful

    浅谈RESTful 什么是RESTful? REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Ro ...

  8. 【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  9. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

随机推荐

  1. 深入分析Java反射(八)-优化反射调用性能

    Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Deb ...

  2. Python内置文件

    概述 为了提升效率,Python有些内置文件如 __pycache__.py 详解 1)__pycache__.py, python程序运行时不需要编译成二进制代码,而直接从源码运行程序 Python ...

  3. Ubuntu---gedit 打开windows 下 .txt 文件乱码的解决方法

    问题出现情况:在windows 下编辑的 .txt 文件复制到 Ubuntu 下打开,默认打开方式为 gedit 软件打开,出现如下乱码: 出现原因:在 windows 系统下,.txt 文件默认编码 ...

  4. PAT Advanced 1085 Perfect Sequence (25) [⼆分,two pointers]

    题目 Given a sequence of positive integers and another positive integer p. The sequence is said to be ...

  5. Chladni Figure CodeForces - 1162D (暴力,真香啊~)

    Chladni Figure CodeForces - 1162D Inaka has a disc, the circumference of which is nn units. The circ ...

  6. Electron基础 - 如何创建模态窗体

    在开发桌面端应用我们常常需要弹出一个提示窗体或者对话框,而提示窗体和对话框和普通窗体的区别是,在提示框出现时,其它窗体就被锁定了,必须要等到提示框被正确关闭时其它窗体才能“解锁”,这种类型的窗体叫做模 ...

  7. vue执行期间的函数

    先放上vue官方给的函数图

  8. ZJNU 1196 - 三阶魔方【模拟题】——高级

    大模拟,空想很容易把面和面之间的关系搞混 所以这时候需要自己找一个正方体(实在不行长方体代替)跟着图把每个面正方向标出来 然后模拟6种操作分别会对哪些块进行操作 对于储存数据的想法是,对输入输出进行分 ...

  9. Web API接口

    Web API接口 一.什么是Web API接口 通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介 Web API接口和一般的url链接还是有区别的,Web API接口简单概 ...

  10. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:读取MNIST手写图片数据写入的TFRecord文件

    import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_dat ...