0

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

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.comtowww.paid-content.com/article.html并超过限制,那么后退按钮将我带回到www.website.com.

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

谢谢你的帮助!:)

4

1 回答 1

0

这确实是预期的行为。本质上,您是在告诉浏览器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);
    }
}

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

于 2012-11-15T11:14:12.247 回答