【问题标题】:Infinite loop in page redirection页面重定向中的无限循环
【发布时间】:2020-07-22 00:33:02
【问题描述】:

我们不断开发不同的页面供内部使用,有些页面可能会重定向到其他页面。假设公司变得更大,页面变得越来越多。有没有办法检测这些页面之间的重定向循环?

【问题讨论】:

  • 您可以使用类似 Screaming Frog 的工具进行网站扫描并报告任何错误,并且它会测试在任何页面中找到的每个链接,因此您将其设为主页,可能还有所有网站将被测试(启发式地讲)......我正在用它做这些事情,据我所知,到目前为止它工作得很好

标签: algorithm testing computer-science infinite-loop software-design


【解决方案1】:

为每个页面构建一个图,如果页面 A 重定向到页面 B,则构建一个从节点 A 到节点 B 的有向边。

那么您的问题是在有向图中找到循环的经典问题。这可以使用 Tarjan 的 强连接组件 算法解决,其中每个大小 > 1 的强连接组件都意味着这些页面之间存在一个循环。

【讨论】:

    【解决方案2】:

    您可以在查询参数中传递重定向面包屑,在每次重定向时检查您要重定向到的页面是否之前已经出现在面包屑中:

    breadcrumbs = querystring["breadcrumbs"].split("-")
    if not breadcrumbs.contains(targetpageid) then
        redirect(targetpageurl + "?breadcrumbs=" + querystring["breadcrumbs"] + "," +  mypageid)
    

    调整上述内容甚至可能有意义,以便在面包屑中出现两次的第一个页面终止重定向循环,以便每个页面只需要知道自己的页面 id(而不是其目标的页面 id) .当然,如果重定向 URL 可能仅因查询参数而有所不同,则您可能需要为每个可能重定向的参数组合使用不同的页面 ID;在这种情况下,可能对 URL 进行散列(不包括面包屑参数)并将该散列用作页面 ID 可能是有意义的。如果该函数不会产生太多冲突,您可能可以使用相对较短的哈希值。

    如果您担心用户在最终页面上看到大而难看的面包屑字符串(一旦重定向停止),您还可以让您的页面不再检测到重定向,然后在没有面包屑参数的情况下重定向到它们自己。您可以将缺少面包屑参数表示该页面不能重定向,或者您可以将页面重定向到自身,并将面包屑字符串设置为它自己的 pageid。如果您使用上面提到的修改让页面在两次检测到自己在面包屑中时停止循环,这将起作用,用户只会看到一个页面 id - 他们正在查看的页面的那个。

    显然,将面包屑信息放在查询字符串中允许最终用户覆盖行为并有效地防止或允许重定向。如果您不想允许这样做,您可以将面包屑信息保留在后端(数据库、redis 等)中,并在查询字符串中传递一个会话。每个重定向都将使用会话密钥来查找面包屑,系统的工作方式或多或少与上述相同。

    您甚至可以通过在某处写日志或发送电子邮件来让系统在发生这种情况时通知管理员。如果您不想要循环并且目标是在发现循环时将其删除,而不是通过打破确实存在的循环来简单地防止运行时无限重定向,这可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 2013-01-25
      • 2012-06-08
      • 2019-08-31
      相关资源
      最近更新 更多