Redirections

优质
小牛编辑
132浏览
2023-12-01

URL重定向或URL转发是一种保持链接处于活动状态的技术,而实际资源(作为页面,表单或整个Web应用程序)位于不同的URL上。HTTP提供了一种特殊类型的响应(HTTP重定向),用于执行用于多种目的的此操作:正在进行站点维护时的临时重定向,在站点体系结构更改后保持外部链接正常工作的永久重定向,上载文件时的进度页,还有很多 …

原理

在HTTP中,服务器通过向请求发送特殊响应来重定向重定向。HTTP重定向是状态码为的响应3xx。浏览器在收到重定向响应时,会使用提供的新网址并立即加载该网址:大多数情况下,重定向对用户来说都是透明的,除此之外性能下降很小。

有几种类型的重定向,它们分为三类:永久性,临时性和特殊重定向。

永久重定向

这些重定向意味着永远持续下去。他们暗示原来的网址不应该再使用,并且新的网址是首选。搜索引擎机器人会触发其索引中相关资源的URL更新。

Code

Text

Method handling

Typical use case

301

Moved Permanently

GET methods unchanged. Others may or may not be changed to GET.1

Reorganization of a Web site.

308

Permanent Redirect

Method and body not changed.

Reorganization of a Web site, with non-GET links/operations.

1规范没有意图允许更改方法,但实际上有用户代理在这里执行此操作。308已被创建以消除使用非GET方法时行为的不明确性。

临时重定向

有时,所请求的资源无法从其规范位置访问,但可以从其他位置访问。在这种情况下,可以使用临时重定向。搜索引擎机器人不会记住新的临时链接。在创建,更新和删除资源以呈现临时进度页面时,也会使用临时重定向。

文本

方法处理

典型的用例

302

发现

GET方法不变。其他可能会或可能不会更改为GET.2

该网页暂时无法使用,原因尚未预见。这样,搜索引擎不会更新他们的链接。

303

见其他

GET方法不变。其他人更改为GET(身体丢失)。

用于在PUT或POST之后重定向,以防止重新触发操作的页面刷新。

307

临时重定向

方法和主体没有改变

该网页暂时无法使用,原因尚未预见。这样,搜索引擎不会更新他们的链接。当网站上的非GET链接/操作可用时,优于302。

2规范没有意图允许方法改变,但实际上有用户代理在那里做这个。307已被创建以消除使用非GET方法时行为的不明确性。

特殊的重定向

除了这些通常的重定向之外,还有两个特定的重定向。的304(没有改变)一个页面到本地缓存的副本(这是陈旧的)重定向,以及300(可多选)是手动重定向:身体,由浏览器作为网页呈现,列出了可能的重定向和用户点击一个选择它。

文本

典型的用例

300

多项选择

并不多:这些选择被列在正文的HTML页面中。可以提供200 OK状态。

304

未修改

缓存刷新:这表示缓存值仍然是新鲜的可以使用。

指定重定向的替代方法

HTTP重定向不是定义重定向的唯一方法。还有其他两种方法:使用<meta>元素的HTML重定向,以及使用DOM的 JavaScript重定向。

HTML重定向

HTTP重定向是创建重定向的首选方式,但有时Web开发人员无法控制服务器或无法对其进行配置。对于这些特殊情况下,Web开发人员可以用一门手艺的HTML页面<meta>元素和http-equiv设置属性refresh<head>页面。当显示页面时,浏览器会找到这个元素并且会转到指定的页面。

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

content属性以一个数字开头,表示浏览器在重定向到给定URL之前等待多少秒。始终将其设置0为更好的可访问性。

显然,这种方法只适用于HTML页面(或类似的),不能用于图像或任何其他类型的内容。

请注意,这些重定向会破坏浏览器中的后退按钮:您可以返回到带有此标题的页面,但它会立即再次向前移动。

JavaScript重定向

JavaScript中的重定向是通过为window.location属性设置一个值并加载新页面来创建的。

window.location = "http://www.example.com/";

与HTML重定向一样,这不能适用于所有资源,显然这只会在执行JavaScript的客户端上起作用。另一方面,有更多的可能性,例如,只有满足一些条件时才能触发重定向。

优先顺序

对于URL重定向有三种可能性,可以同时指定几种方法,但首先应用哪一种?优先顺序如下:

  1. 当甚至没有传输页面时,HTTP重定向总是首先执行,当然甚至没有读取。
  1. <meta>如果没有任何HTTP重定向,则执行HTML重定向()。
  1. 只有在客户端启用JavaScript的情况下,JavaScript重定向才是最后的手段。

如果可能,请始终尝试使用HTTP重定向,并且不要使用<meta>元素。如果开发人员更改HTTP重定向并忘记HTML重定向,则重定向不再相同,或者以无限循环结束,或发生其他噩梦。

用例

有很多用于重定向的用例,但由于每次重定向都会影响性能,所以它们的使用应该保持在最低限度。

域别名

理想情况下,一个资源有一个位置,因此有一个URL。但是有理由希望有一个资源的替代名称(几个域名,比如有或没有www前缀,或者更短和易记的URL,...)。在这些情况下,不要复制资源,而是使用重定向到一个真正的(规范)URL是有用的。

出于以下几个原因可以完成域别名化:

  • 扩大您网站的覆盖面。一个常见的情况是,当您的网站位于www.example.com域名下时,您也example.com应该可以访问您的网页。在这种情况下设置example.com页面的重定向www.example.com。您也可能会提供常用的同义词名称,或经常输入您的域名的拼写错误。
  • 转移到其他域。例如,您的公司已被重新命名,当您搜索旧名称时,您希望习惯了旧公司网站的用户仍能以新名称找到您。
  • 强制HTTPS。对您网站的HTTP版本的请求将被重定向到您网站的HTTPS版本。

保持链接活着

当您重新组织网站时,资源的URL会发生变化。即使您可以更新网站的内部链接以匹配新的命名方案,也无法控制外部资源使用的URL。你不想破坏这些链接,因为它们为你带来有价值的用户(并帮助你的搜索引擎优化),所以你设置了从旧网址到新网址的重定向。

即使这种技术也适用于内部链接,您应该尽量避免内部重定向。重定向具有显着的性能成本(因为额外的HTTP请求已完成),如果可以通过更正内部链接来避免它,则应修复这些链接。

对不安全请求的临时响应

不安全的请求修改服务器的状态,用户不应无意中重播它们。通常情况下,你不希望你的用户重新发送PUTPOSTDELETE请求。如果您只是作为此请求的结果提供响应,则只需简单按下重新加载按钮(可能在确认消息之后),重新发送请求。

在这种情况下,服务器可以发回303包含正确信息的(请参阅其他)响应,但如果按下重新加载按钮,则只会重新显示此页面,而不会重播不安全的请求。

针对长时间请求的临时响应

某些请求可能需要更多时间在服务器上,例如有时DELETE请求被安排用于稍后处理。在这种情况下,响应是一个303(请参见其他)重定向,该重定向链接到指示该操作已安排的页面,并最终通知有关进度或允许取消该进度。

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

阿帕奇

重定向可以在服务器配置文件中或.htaccess每个目录中设置。

所述mod_alias中模块具有RedirectRedirect_Match该设置了指令302(默认)的反应:

<VirtualHost *:80>
	ServerName example.com
	Redirect / http://www.example.com</VirtualHost>

该URL http://example.com/将被重定向到http://www.example.com/(但不是http://example.com/other.html

Redirect_Match 做同样的事情,但需要一个正则表达式来定义受影响的URL集合:

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

images/文件夹中的所有文档都将重定向到不同的域。

如果您不想设置临时重定向,则可以使用额外参数(要使用的HTTP状态码或permanent关键字)来设置不同的重定向:

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

该mod_rewrite的模块也可以用来创建重定向。它更灵活,但使用起来更复杂一些。

Nginx

在Nginx中,您为要重定向的内容创建特定的服务器块:

server {
	listen 80;
	server_name example.com;return 301 $scheme://www.example.com$request_uri;}

要仅将重定向应用于文件夹或页面的子集,请使用以下rewrite指令:

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

IIS

在IIS中,您使用该<httpRedirect>元素来配置重定向。

重定向循环

当连续的重定向遵循已经遵循的重定向时,重定向循环发生。换句话说,有一个永远不会完成的循环,最终不会找到任何页面。

大多数情况下,这是一个服务器问题,如果服务器无法检测到,它会发回一个500 Internal Server Error。如果在修改服务器配置后很快遇到这样的错误,这可能是重定向循环。

有时候,服务器不会检测到它:重定向循环可以分布在几台服务器上,每台服务器都没有完整的图像。在这种情况下,浏览器会检测到它并发布错误消息。Firefox将显示:

Firefox has detected that the server is redirecting the request for this address in a way that will never complete.

而Chrome会显示:

This Webpage has a redirect loop

在这两种情况下,用户都无法做很多事情(除非他们身上发生了腐败现象,例如缓存或Cookie不匹配)。

避免重定向循环很重要,因为它们完全破坏了用户体验。

在MDN上编辑此页面