HTTP 302重定向返回的位置不会出现在浏览器历史记录中?

时间:2013-12-02 02:38:09

标签: http redirect browser

我正在开发一个用于审核用户生成内容的内部应用程序。

当用户访问该应用程序时,他们会被重定向到?page=X(其中X是需要审核的下一页)。审核完页面后,他们点击指向?next的链接,服务器响应另一个302重定向到需要审核的下一页(例如?page=Y):

  • 点击 ?next - 302 - > ?page=X
  • 点击 ?next - 302 - > ?page=Y
  • 点击 ?next - 302 - > ?page=Z

问题是这些页面没有出现在浏览器的历史记录中。例如,如果用户看到页面X,则页面Y,页面Z,页面YZ将不会出现在历史记录中(例如,如果用户按下后退按钮,他们将被带到页面X

我有一个视频演示了这个问题:http://www.youtube.com/watch?v=k_-NfZzZ700

如何确保显示的所有页面也出现在浏览器的历史记录中?

我也尝试过使用HTTP 303重定向,效果相同。

(注意:我意识到我可以在每个页面中包含指向下一页的链接,因为多个审阅者可能同时工作)

这是视频中使用的代码:

from flask import Flask, request, redirect

app = Flask(__name__)
x = [1]

@app.route("/")
def index():
    page = request.args.get("page")
    if not page:
        return redirect("?page=%s" %(x[0], ))
    x[0] += 1
    return """
        <html>
            <title>%s</title>
            <body>
                <p>page: %s</p>
                <a href="?next">go to next page</a>
            </body>
        </html>
    """ %(page, page)

if __name__ == "__main__":
    app.run()

2 个答案:

答案 0 :(得分:1)

这是在黑暗中拍摄的,但是HTTP 303看起来就像你想要的那样。

答案 1 :(得分:1)

显然,Chrome正在使用未经重定向的网址进行历史记录比较。由于未重定向的URL是相同的(“下一个”),因此不添加任何条目。行为类型是有意义的,因为非重定向的URL是用户打算遵循的,并且您没有说该更改是永久性的。不过,这可能被视为浏览器错误(FF25表现得如预期的那样);见this issue

所以,虽然看起来没有真正的“解决方案”,但至少有一个解决方法:如果你确保“下一个”网址始终是唯一的(例如,通过附加时间戳查询参数),每个项目将在历史列表中获得自己的条目。当然,根据您的真实应用程序的工作方式(HTML缓存等),这可能不是一个选项/: