目录搜索
GuidesAccess control CORSAuthenticationBrowser detection using the user agentCachingCaching FAQCompressionConditional requestsConnection management in HTTP 1.xContent negotiationContent negotiation: List of default Accept valuesCookiesCSPMessagesOverviewProtocol upgrade mechanismProxy servers and tunnelingProxy servers and tunneling: Proxy Auto-Configuration (PAC) filePublic Key PinningRange requestsRedirectionsResources and specificationsResources and URIsResponse codesServer-Side Access ControlSessionGuides: BasicsBasics of HTTPChoosing between www and non-www URLsData URIsEvolution of HTTPIdentifying resources on the WebMIME TypesMIME types: Complete list of MIME typesCSPContent-Security-PolicyContent-Security-Policy-Report-OnlyCSP: base-uriCSP: block-all-mixed-contentCSP: child-srcCSP: connect-srcCSP: default-srcCSP: font-srcCSP: form-actionCSP: frame-ancestorsCSP: frame-srcCSP: img-srcCSP: manifest-srcCSP: media-srcCSP: object-srcCSP: plugin-typesCSP: referrerCSP: report-uriCSP: require-sri-forCSP: sandboxCSP: script-srcCSP: style-srcCSP: upgrade-insecure-requestsCSP: worker-srcHeadersAcceptAccept-CharsetAccept-EncodingAccept-LanguageAccept-RangesAccess-Control-Allow-CredentialsAccess-Control-Allow-HeadersAccess-Control-Allow-MethodsAccess-Control-Allow-OriginAccess-Control-Expose-HeadersAccess-Control-Max-AgeAccess-Control-Request-HeadersAccess-Control-Request-MethodAgeAllowAuthorizationCache-ControlConnectionContent-DispositionContent-EncodingContent-LanguageContent-LengthContent-LocationContent-RangeContent-TypeCookieCookie2DateDNTETagExpectExpiresForwardedFromHeadersHostIf-MatchIf-Modified-SinceIf-None-MatchIf-RangeIf-Unmodified-SinceKeep-AliveLarge-AllocationLast-ModifiedLocationOriginPragmaProxy-AuthenticateProxy-AuthorizationPublic-Key-PinsPublic-Key-Pins-Report-OnlyRangeRefererReferrer-PolicyRetry-AfterServerSet-CookieSet-Cookie2SourceMapStrict-Transport-SecurityTETkTrailerTransfer-EncodingUpgrade-Insecure-RequestsUser-AgentUser-Agent: FirefoxVaryViaWarningWWW-AuthenticateX-Content-Type-OptionsX-DNS-Prefetch-ControlX-Forwarded-ForX-Forwarded-HostX-Forwarded-ProtoX-Frame-OptionsX-XSS-ProtectionMethodsCONNECTDELETEGETHEADMethodsOPTIONSPATCHPOSTPUTStatus100 Continue101 Switching Protocols200 OK201 Created202 Accepted203 Non-Authoritative Information204 No Content205 Reset Content206 Partial Content300 Multiple Choices301 Moved Permanently302 Found303 See Other304 Not Modified307 Temporary Redirect308 Permanent Redirect400 Bad Request401 Unauthorized403 Forbidden404 Not Found405 Method Not Allowed406 Not Acceptable407 Proxy Authentication Required408 Request Timeout409 Conflict410 Gone411 Length Required412 Precondition Failed413 Payload Too Large414 URI Too Long415 Unsupported Media Type416 Range Not Satisfiable417 Expectation Failed426 Upgrade Required428 Precondition Required429 Too Many Requests431 Request Header Fields Too Large451 Unavailable For Legal Reasons500 Internal Server Error501 Not Implemented502 Bad Gateway503 Service Unavailable504 Gateway Timeout505 HTTP Version Not Supported511 Network Authentication RequiredStatus
文字

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上编辑此页面

上一篇:下一篇: