【问题标题】:Best practices for client side vs. server side redirects: When to use what?客户端与服务器端重定向的最佳实践:何时使用什么?
【发布时间】:2010-02-22 14:27:40
【问题描述】:

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

你什么时候会选择一个而不是另一个?

关于 ASP.net/IIS7(集成模式下的应用程序池,启用 32 位应用程序=false),我注意到即使页面有 302 标头,整个页面正文也会发送到客户端。

I believe this is not the case with PHP,只发送标头?去引用 客户端重定向意味着以下步骤:客户端->服务器端->客户端->服务器端->客户端。

在服务器端重定向意味着:客户端 -> 服务器端 -> 客户端(仅标头)* -> 服务器端 -> 客户端。

W3C 标准或服务器端重定向实现是否因一种 Web 服务器技术与另一种不同?

编辑:我只关心 Response.Redirect(在 asp.net 中)而不是 server.transfer,至少对于本次讨论而言

【问题讨论】:

    标签: redirect client webserver


    【解决方案1】:

    JavaScript 示例实际上不是重定向。没有301/302 回复的方式。这只是一个简单的请求,在页面到达后很长一段时间内发生在某个 Javascript 事件中。如果您在页面加载期间执行此操作,那么它会比真正的重定向产生更多开销,并且它也不适用于禁用 JS 的浏览器。

    重定向将从服务器端以 301/302 响应启动。所有 webapp 语言/框架默认为 302。您通常可以通过添加一个额外的参数或代码行来将其设为 301。 301 的好处是特定请求不会被搜索机器人(不再)编入索引。

    【讨论】:

      【解决方案2】:

      在 ASP.Net 中,两种服务器端重定向之间有一个重要的区别。它们是 Response.Redirect 和 Server.Transfer。

      如果您调用 Response.Redirect,则需要两次往返服务器。在第一次调用服务器时,服务器响应指示浏览器请求下一页。请求下一页构成到 Web 服务器的第二次往返。

      如果您使用 Server.Transfer,则只有一次往返。因此,网络流量要少得多。但是,使用 Server.Transfer 有一个限制,即目标页面必须位于同一 Web 服务器上。也就是说,您不能将 Server.Transfer 从您的网络应用程序转移到 www.Google.com。但是你可以 Response.Redirect 到它。

      使用这两种方法中的任何一种都涉及到其他细节,您需要在使用它们之前进行研究。但是,我认为在这个问题的上下文中,值得注意的是,在任何语言中,Response.Redirect 可能会导致比实际需要的网络流量大得多。

      【讨论】:

      • 感谢您的回复。与 Response.Redirect 不同,Server.Transfer 不会发送 302。抱歉,我的问题不清楚
      【解决方案3】:

      这实际上取决于您决定需要重定向的位置。如果是服务器端代码确定您必须重定向,那么它是服务器端代码发出重定向命令。如果您可以决定客户端需要重定向,请从客户端代码中执行。

      这可能从客户端更有效,因为您避免了服务器端重定向的来回操作..

      【讨论】:

      • 如果是服务器端代码决定你必须重定向什么阻止服务器端代码添加javascript代码,告诉客户端重定向?
      • 没什么——如果你愿意,你可以这样做,但对我来说,调用 Response.Redirect 比生成 javascript 来设置 window.location.href 更容易。并且对浏览器的响应应该小一点。 PS - 根据我的经验,asp.net 发送带有 Response.Redirect 的整个页面内容 - 它只发送标准“对象移动到”消息的必要标题和少量 html (很少使用)。
      • 是的,雷,我很惊讶在查尔斯身上看到了这一点。 Cassini 和 IIS7 集成模式都会发生这种情况,但未与其他服务器/服务器配置进行检查
      • 查尔斯?当您说“整个页面正文已发送”时,您是指您的所有文本/表单字段/图像/等吗?
      • 是的。查尔斯调试代理。响应包括我在 HttpModule-EndRequest 中添加的任何文本
      猜你喜欢
      • 2012-05-24
      • 2020-08-15
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多