【问题标题】:Browser loses history after a redirect via varnish is sent发送通过 varnish 的重定向后浏览器丢失历史记录
【发布时间】:2012-10-22 07:23:18
【问题描述】:

我目前正在 varnish 中实施付费专区。在某些情况下,我会通过 varnish 发送重定向:

sub process_request {
    if (req.http.count ~ "5") {
        error 302;
    }
}

在相应的错误子例程中,我这样重定向:

sub paywall_redirect {
    if (obj.status == 302 && req.http.count ~ "5") {
        set obj.http.Location = "http://www.google.com/";
    }
}

幸运的是逻辑有效,但不幸的是,我丢失了在重定向到 google.com 之前使用的域的浏览器历史记录。

假设我创建了一个新标签,为我想阅读的某篇文章打开了 www.paid-content.com/article.html 并超过了计数器限制(例如,通过重新加载页面)。然后我被重定向到www.google.com 并且浏览器的后退按钮被禁用。

假设我从www.website.comwww.paid-content.com/article.html 并超过限制,然后返回按钮将我带回www.website.com

这种行为是故意的吗?我应该如何在 varnish 中重定向以保留浏览器的历史记录?

感谢您的帮助! :)

【问题讨论】:

    标签: redirect varnish


    【解决方案1】:

    这确实是预期的行为。本质上,您是在告诉浏览器www.paid-content.com/article.html 现在位于www.google.com。浏览器会缓存这些信息,它也会影响历史记录。

    完成重定向的最佳方式是通过自定义错误处理程序。

    sub process_request {
        if (req.http.count ~ "5") {
            error 750;
        }
    }
    

    然后在您的自定义错误处理程序中创建一个带有元刷新标记的合成响应正文。即使元刷新也有其缺点,但它应该以您想要的方式保留浏览历史记录。

    sub paywall_redirect {
        if (obj.status == 750 && req.http.count ~ "5") {
            set obj.http.Content-Type = "text/html; charset=utf-8";
            synthetic {"
               <html>
                 <head>
                   <meta http-equiv="refresh" content="0;URL='http://www.google.com/'">
                 </head>
                 <body></body>
               </html>
            "};
            return(deliver);
        }
    }
    

    也许更优雅的解决方案是显示一个合成页面,说明付费专区已被击中,但这确实是一个偏好问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多