Algorithm 页面重定向中的无限循环

Algorithm 页面重定向中的无限循环,algorithm,testing,computer-science,infinite-loop,software-design,Algorithm,Testing,Computer Science,Infinite Loop,Software Design,我们不断开发不同的页面供内部使用,有些页面可能会重定向到其他页面。假设公司变大了,网页变得越来越多。有没有一种方法可以检测这些页面之间的重定向循环?构建一个图,其中每个页面都有一个节点,如果页面a重定向到页面B,则有一条从节点a到节点B的定向边 那么你的问题就是在有向图中找到一个圈的经典问题。使用Tarjan的强连接组件算法可以解决这一问题,其中大小大于1的每个强连接组件都意味着这些页面之间存在一个循环。构建一个图形,每个页面都有一个节点,如果页面a重定向到页面B,则有一条从节点a到节点B的定向

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

构建一个图,其中每个页面都有一个节点,如果页面a重定向到页面B,则有一条从节点a到节点B的定向边


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

构建一个图形,每个页面都有一个节点,如果页面a重定向到页面B,则有一条从节点a到节点B的定向边


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

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

breadcrumbs = querystring["breadcrumbs"].split("-")
if not breadcrumbs.contains(targetpageid) then
    redirect(targetpageurl + "?breadcrumbs=" + querystring["breadcrumbs"] + "," +  mypageid)
甚至可以调整上述参数,使面包屑中出现两次的第一个页面终止重定向循环,这样每个页面只需要知道自己的页面id(而不需要知道其目标的页面id)。当然,如果重定向URL可能只因查询参数不同而不同,那么对于可能重定向的每个参数组合,您都需要不同的页面ID;在这种情况下,或许可以对URL(不包括breadcrumbs参数)进行散列,并将该散列用作页面ID。如果函数不会产生太多冲突,则可以使用相对较短的散列

如果您担心用户在最终页面上看到丑陋的大breadcrumbs字符串(一旦重定向停止),您还可以让页面检测不到进一步的重定向,然后在不使用breadcrumbs参数的情况下重定向到自己。您可以认为没有breadcrumbs参数意味着页面不能重定向,或者可以将页面重定向到自身,并将breadcrumbs字符串设置为其自己的pageid。如果您使用上面提到的修改,让页面在两次检测到自己在面包屑中时停止循环,这将起作用,用户将只看到一个页面id——他们正在查看的页面的id

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


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

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

breadcrumbs = querystring["breadcrumbs"].split("-")
if not breadcrumbs.contains(targetpageid) then
    redirect(targetpageurl + "?breadcrumbs=" + querystring["breadcrumbs"] + "," +  mypageid)
甚至可以调整上述参数,使面包屑中出现两次的第一个页面终止重定向循环,这样每个页面只需要知道自己的页面id(而不需要知道其目标的页面id)。当然,如果重定向URL可能只因查询参数不同而不同,那么对于可能重定向的每个参数组合,您都需要不同的页面ID;在这种情况下,或许可以对URL(不包括breadcrumbs参数)进行散列,并将该散列用作页面ID。如果函数不会产生太多冲突,则可以使用相对较短的散列

如果您担心用户在最终页面上看到丑陋的大breadcrumbs字符串(一旦重定向停止),您还可以让页面检测不到进一步的重定向,然后在不使用breadcrumbs参数的情况下重定向到自己。您可以认为没有breadcrumbs参数意味着页面不能重定向,或者可以将页面重定向到自身,并将breadcrumbs字符串设置为其自己的pageid。如果您使用上面提到的修改,让页面在两次检测到自己在面包屑中时停止循环,这将起作用,用户将只看到一个页面id——他们正在查看的页面的id

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


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

您可以使用类似尖叫蛙的工具来进行网站扫描并报告任何错误,它将测试任何页面中找到的每个链接,所以你给它主页,可能所有的网站都会被测试(试探性地说)。。。我正在用它做这件事,到目前为止,它工作得很好。据我所知,你可以使用像尖叫的青蛙这样的东西来进行网站扫描,并随时报告你