避免重定向循环

Posted

技术标签:

【中文标题】避免重定向循环【英文标题】:Avoiding redirect loop 【发布时间】:2016-02-25 05:19:37 【问题描述】:

我已完成在我的网页上设置维护功能。这是index.php代码

    <?php
        session_start();
        require_once("system/functions.php");
        require_once("system/config.php");
        if($maintenance == 1)
            require_once(header("Location: index.php?page=maintenance"));
            die();
            session_destroy();
        elseif($maintenance == 0)
        
            getPage();
        
    ?>

我也试过

    header("Location: index.php?page=maintenance");

而不是上面的 require once 标头代码。 但是如果我把

    require_once("frontend/pages/maintenance.php");

它会起作用的。那么问题是人们可以在地址栏中输入他们想要的每个页面,这会显示出来。我需要它来使用它自己的 url(与上面的 2 个标头代码一起使用,但我收到太多重定向错误),无论如何,您将被重定向到此 url 以查看维护屏幕

maintenance.php文件的php部分:

<?php
if($maintenance == 0)
    header("Location: index.php?page=index");
    die();

else
    header("Location: index.php?page=maintenance");
    die();

?>

我可以删除maintenance.php文件中的else代码部分,但它总是会重定向到“websitename”/index.php(虽然仍然是维护屏幕,与上面提到的问题相同)

所以我需要更改我的代码,以便在进行维护时,无论如何都会将您重定向到 index.php?page=maintenance。抱歉,如果我错过了一些细节,那就晚了。如果需要,请随时问我这个问题:)

【问题讨论】:

实际显示维护页面的代码在哪里?在 index.php 还是在 maintenance.php 中? 它在maintenance.php中。现在问题已经解决了:) 【参考方案1】:

确实,这看起来像是在循环。当您在 index.php 脚本中时执行以下操作:

require_once(header("Location: index.php?page=maintenance"));

所以你实际上再次加载了你已经在运行的脚本。它会再次找到 maintenance==1 并再次执行完全相同的操作。

您应该只重定向一次,然后当您看到您已经在 page=maintenance URL 上时,实际上会显示您想要显示为维护消息的内容,如下所示:

session_start();
require_once("system/functions.php");
require_once("system/config.php");
if($maintenance == 1)
    if ($_GET['page']) == 'maintenance') 
        // we have the desired URL in the browser, so now
        // show appropriate maintenance page
        require_once("frontend/pages/maintenance.php");
     else 
        // destroy session before exiting with die():
        session_destroy();
        header("Location: index.php?page=maintenance");
    
    die();

// no need to test $maintenance is 0 here, the other case already exited
getPage();

确保您在 frontend/pages/maintenance.php 重定向到 index.php?page=maintenance,否则您将还是会陷入循环。

所以 frontend/pages/maintenance.php 应该是这样的:

// make sure you have not output anything yet with echo/print
// before getting at this point:
if($maintenance == 0)
    header("Location: index.php?page=index");
    die();

// "else" is not needed here: the maintenance==0 case already exited

// display the maintenance page here, but don't redirect.
echo "this is the maintenance page";
// ...

【讨论】:

非常感谢!它现在完美运行,正是我想要的方式:)

以上是关于避免重定向循环的主要内容,如果未能解决你的问题,请参考以下文章

避免 301 重定向缓存

使用 SSL 避免登录页面重定向

我可以手动覆盖谷歌优化重定向,并避免外部重定向吗?

Laravel 重定向返回导致重定向循环

“此网页有一个重定向循环”(使用 GeoIP 重定向网站)

重定向到子域会导致重定向循环错误