Redirections
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重定向有三种可能性,可以同时指定几种方法,但首先应用哪一种?优先顺序如下:
- 当甚至没有传输页面时,HTTP重定向总是首先执行,当然甚至没有读取。
<meta>
如果没有任何HTTP重定向,则执行HTML重定向()。
- 只有在客户端启用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请求已完成),如果可以通过更正内部链接来避免它,则应修复这些链接。
对不安全请求的临时响应
不安全的请求修改服务器的状态,用户不应无意中重播它们。通常情况下,你不希望你的用户重新发送PUT
,POST
或DELETE
请求。如果您只是作为此请求的结果提供响应,则只需简单按下重新加载按钮(可能在确认消息之后),重新发送请求。
在这种情况下,服务器可以发回303
包含正确信息的(请参阅其他)响应,但如果按下重新加载按钮,则只会重新显示此页面,而不会重播不安全的请求。
针对长时间请求的临时响应
某些请求可能需要更多时间在服务器上,例如有时DELETE
请求被安排用于稍后处理。在这种情况下,响应是一个303
(请参见其他)重定向,该重定向链接到指示该操作已安排的页面,并最终通知有关进度或允许取消该进度。
在通用服务器中配置重定向
阿帕奇
重定向可以在服务器配置文件中或.htaccess
每个目录中设置。
所述mod_alias中模块具有Redirect
与Redirect_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上编辑此页面