客户端重定向和服务器端重定向的最佳实践:何时使用哪种?

26

我知道大多数语言都支持服务器端重定向:(asp.net: Response.Redirect, PHP: header('newpage');)。你也可以使用JavaScript进行重定向:(window.location.href="newLocationURL")

在什么情况下会选择其中一种方式?

就ASP.net/IIS7(应用程序池处于集成模式,启用32位应用程序=false)而言,我注意到即使页面具有302头文件,整个页面主体也会发送到客户端。

我相信PHP并非如此,只有头文件被发送了?引用以下内容: 客户端 -> 服务器端 -> 客户端 -> 服务器端 -> 客户端的客户端侧重定向。 服务器端上的重定向意味着:客户端 -> 服务器端 -> 仅限客户端(仅限头文件)-> 服务器端 -> 客户端。

是否有W3C标准或不同的Web服务器技术实现的服务器端重定向不同?

注:对于这个讨论,我只关心Response.Redirect(在asp.net中),而不是server.transfer。

3个回答

12

这个 JavaScript 的例子实际上不是一个重定向。它没有提供301/302响应的方式。它只是一个简单的请求,在页面到达后某个 Javascript 事件期间发生。如果在页面加载期间执行此操作,则会比真正的重定向增加更多的开销,并且在禁用 JS 的浏览器上也无法工作。

重定向应该由服务器端使用 301/302 响应来启动。所有 Web 应用程序语言/框架都默认为 302。您通常可以通过添加一个额外的参数或代码行来将其设置为 301。顺便说一下,301 的好处是特定请求不再被搜索引擎爬虫索引。


6
在ASP.Net中,有两种重要的服务器端重定向。它们分别是Response.Redirect和Server.Transfer。
如果您调用Response.Redirect,则涉及两个往返到服务器的通信。在第一次调用服务器时,服务器响应指示浏览器请求下一个页面,请求该下一个页面构成了对Web服务器的第二个往返。
如果使用Server.Transfer,则只有一个往返。因此,网络流量要少得多。但是,使用Server.Transfer有一个限制,即目标页面必须在同一Web服务器上。也就是说,您不能从Web应用程序转移到www.Google.com。但您可以对其进行Response.Redirect。
在使用任何语言时,这两种方法都有其他详细信息需要研究。但是,我认为在这个问题的背景下需要注意的是,Response.Redirect可能会导致比实际需要更大的网络流量

Server.Transfer不像Response.Redirect一样发送302。抱歉,我的问题表述不够清楚。 - ram

0

这真的取决于您决定在何处需要重定向。如果是服务器端代码确定必须重定向,那么就是服务器端代码发出重定向命令。如果您可以在客户端决定需要重定向,则应从客户端代码中执行。

从客户端执行可能更有效率,因为您避免了服务器端重定向的来回传输。


如果是服务器端代码决定需要重定向,那么有什么阻止服务器端代码添加JavaScript代码,告诉客户端进行重定向呢? - ram
1
没有什么问题 - 如果你愿意,可以这样做,但对我来说,调用Response.Redirect比生成设置window.location.href的javascript更容易。而且向浏览器响应的内容应该会少一些。另外,根据我的经验,asp.net在使用Response.Redirect时不会发送整个页面内容,它只会发送必要的标题和标准"对象已移动到"消息的少量HTML代码(这很少被使用)。 - Ray
是啊 Ray,我在 Charles 中看到这种情况也感到惊讶。无论是 Cassini 还是 IIS7 集成模式,都会发生这种情况,尽管还没有检查其他服务器/服务器配置。 - ram
Charles?当你说“整个页面主体已发送”时,你是指所有的文本/表单字段/图像等吗? - Ray
是的。Charles调试代理。响应包括我在HttpModule-EndRequest中添加的任何文本。 - ram
以前从未听说过Charles,看起来很酷,就像Fiddler一样。无论如何,在Fiddler中,我在Response.Redirect之后看不到任何东西。我构建我的页面,以便如果我要重定向,则不进行任何内容创建,因此对浏览器的响应是最小化的。 - Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接