设置Cookie后PHP重定向不起作用

时间:2017-08-17 06:37:56

标签: php apache

如何修复PHP中的“已发送的标头”错误无法解决问题,因为我没有收到任何标头设置错误。 正在设置cookie,问题是链接转到主页面('/')。它似乎不再进入主页面甚至在跟踪日志上,我没有看到spash.php被重新加载的条目。 它几乎就像从index.php重定向后(当键入http://domain时),浏览器/服务器将http://domain/splash.php识别为主页面。

  • PHP版本:7.0.22
  • Apache版本:2.4.27
  • OS:linux

我有2页,index.php和spash.php。 index.page首先检查经过身份验证的cookie。如果为false或未找到,则页面重定向到splash.php 然后spash.php设置经过身份验证的cookie并使锚点标记具有“/”href值。 但是在单击链接按钮后,页面只会重新加载spash.php。

我在2个页面上添加了跟踪error_logs,从日志中我可以看到,在第一次加载时,它通过index.php页面,然后加载spash.php页面,但之后甚至在链接多次点击后按钮,不再访问index.php页面的日志。

这是我的代码:

的index.php

<?php if(!isset($_COOKIE['authenticated'])){
    error_log("This is Index, Redirect to Splash Page");
    header("Location: /splash.php" );
    die();
    exit();
}else{
    echo "meron";
}
?>
<html>
    <head>
        <title>Index Page</title>
    </head>
    <body>
        <h1>Hello</h1>
        <?php var_dump($_COOKIE); ?>
    </body>
</html>

splash.php

<?php setcookie('authenticated', 1, 0, '/');
    error_log("This is Splash, set the cookie");
    echo $_SERVER['SCRIPT_FILENAME'];
?>
<html>
    <head>
        <title>Splash Page</title>
    </head>
    <body>
        <a href="/">GO!</a>        
    </body>
</html>

注:

  1. 加载启动页面后,如果我输入[domain] /index.php,我会看到主页面。

  2. 此问题仅发生在主机上,在本地尝试了代码,一切正常

  3. 如果我从spash.php(GO!)更改链接按钮的href,它就可以了。但我需要这个价值只是领域。

3 个答案:

答案 0 :(得分:0)

当您使用header位置时,之前不应有任何echo或空格。

答案 1 :(得分:0)

好的,我找到了间接解决方案。 我没有使用服务器端代码(PHP)处理重定向,而是使用了javascript,现在正在使用它。

请参阅以下更新代码:

的index.php

<html>
<head>
    <title>Index Page</title>
    <script>
        document.addEventListener('DOMContentLoaded', onLoad());

        function onLoad(){
            if(getCookie('astig') == ''){
                window.location.href = "/splash.php";
            }

        }

        function getCookie(cname) {
            var name = cname + "=";
            var decodedCookie = decodeURIComponent(document.cookie);
            var ca = decodedCookie.split(';');
            for(var i = 0; i <ca.length; i++) {
                var c = ca[i];
                while (c.charAt(0) == ' ') {
                    c = c.substring(1);
                }
                if (c.indexOf(name) == 0) {
                    return c.substring(name.length, c.length);
                }
            }
            return "";
        }
    </script>
</head>
<body>
    <h1>Hello</h1>
    <?php var_dump($_COOKIE); ?>
</body>

spash.php

<html>
<head>
    <title>Splash Page</title>
    <script>
        document.addEventListener('DOMContentLoaded', onLoad());

        function onLoad(){
            document.cookie = "astig=true;0;path=/";

        }

    </script>
</head>
<body>
    <a href="http://laviel.rocks">GO!</a>        
</body>

答案 2 :(得分:0)

从托管服务提供商的支持获得解决方案。 他禁用了mod过期缓存。所以现在我可以通过纯服务器端脚本进行重定向。

不确定此选项的整体效果以及哪种方法会更好。