在PHP中检测cookie是否启用

11
我正在尝试检测用户在我的页面上是否启用了cookie。以下代码可以执行此检查,但是我不知道如何将用户重定向到他们来自的页面。
该脚本启动会话并检查是否已经检查了cookie。如果没有,则将用户重定向到一个测试页面,由于我在第一页中调用了session_start(),因此如果用户代理启用了cookie,我应该看到PHPSESSID cookie。
问题在于,该脚本可能从我的站点的任何页面调用,并且我必须将它们重定向回其选择的页面,例如index.php?page=news&postid=4。
session_start();
// Check if client accepts cookies //
if (!isset($_SESSION['cookies_ok'])) {
    if (isset($_GET['cookie_test'])) {
        if (!isset($_COOKIE['PHPSESSID'])) {
            die('Cookies are disabled');
        } else {
            $_SESSION['cookies_ok'] = true;
            header(-------- - ? ? ? ? ? -------- -);
            exit();
        }
    }
    if (!isset($_COOKIE['PHPSESSID'])) {
        header('Location: index.php?cookie_test=1');
        exit();
    }
}
4个回答

8
我认为最好的方法是制作一个文件来设置cookie并重定向到另一个文件。然后下一个文件可以检查该值,并确定是否启用了cookie。请参见以下示例。
创建两个文件,cookiechecker.phpstat.php
// cookiechecker.php
// save the referrer in session. if cookie works we can get back to it later.
session_start();
$_SESSION['page'] = $_SERVER['HTTP_REFERER'];
// setting cookie to test
setcookie('foo', 'bar', time()+3600);
header("location: stat.php");

and

stat.php

<?php if(isset($_COOKIE['foo']) && $_COOKIE['foo']=='bar'): 
// cookie is working
session_start();
// get back to our old page
header("location: {$_SESSION['page']}");
else:            // show the message ?>
cookie is not working
<? endif; ?>

在浏览器中加载cookiechecker.php,它会告诉你cookie正在工作。使用命令行调用它,比如curl,它会说cookie没有工作


更新

这里有一个单文件解决方案。

session_start();

if (isset($_GET['check']) && $_GET['check'] == true) {
    if (isset($_COOKIE['foo']) && $_COOKIE['foo'] == 'bar') {
        // cookie is working
        // get back to our old page
        header("location: {$_SESSION['page']}");
    } else {
        // show the message "cookie is not working"
    }
} else {
    // save the referrer in session. if cookie works we can get back to it later.
    $_SESSION['page'] = $_SERVER['HTTP_REFERER'];
   // set a cookie to test
    setcookie('foo', 'bar', time() + 3600);
    // redirecting to the same page to check 
    header("location: {$_SERVER['PHP_SELF']}?check=true");
}

感谢您的时间。我的问题是,假设用户想要访问mypage.com/index.php?page=hello。我想检查cookie是否启用,并显示客户端请求的页面,因此在重定向到cookie检查脚本后,我必须将用户重定向回他最初想要访问的页面。 - ppp
@AnPel 我在1分钟前更新了我的回答,请再次检查。我还添加了如何返回旧的网址的说明。 - Shiplu Mokaddim
好多了。将页面保存到会话中似乎是这里唯一的选择。只是想澄清一下,因为我之前尝试过并得到了语法错误,你为什么在你的位置头中使用 {}?我应该阅读什么来理解这个?再次感谢。 - ppp
@AnPel 请参考复杂引用字符串解析 - Shiplu Mokaddim
如果禁用了cookie并且会话仅使用cookie(如基于头部的重定向建议),则此方法根本无法工作。 - hakre

1

HTTP_REFERER 对我没有用,似乎 REQUEST_URI 是我需要的。

这是我最终使用的代码:

session_start();
// ------------------------------- //
// Check if client accepts cookies //
// ------------------------------- //

if( !isset( $_SESSION['cookies_ok'] ) ) {
    if( isset( $_GET['cookie_test'] ) ) {
        if( !isset( $_COOKIE['PHPSESSID'] ) ) {
            die('Cookies are disabled');
            }
        else {
            $_SESSION['cookies_ok'] = true;
            $go_to = $_SESSION['cookie_test_caller'];
            unset( $_SESSION['cookie_test_caller'] );
            header("Location: $go_to");
            exit();
            }
        }
    if( !isset( $_COOKIE['PHPSESSID'] ) ){
        $_SESSION['cookie_test_caller'] = $_SERVER['REQUEST_URI'];
        header('Location: index.php?cookie_test=1');
        exit();
        }
    }
// ------------------------------- //

0

无需保存原始URL并在之后重定向到它。 您可以通过AJAX执行透明重定向,而不会触发页面重新加载。 它非常简单易实现。 您可以在这里查看我的帖子:https://dev59.com/5mw15IYBdhLWcg3wWqf-#18832817


你应该避免回答链接,因为该页面可能会在未来被删除。 - pinckerman

0

我认为这是最简单的解决方案。不需要单独的文件,如果启用了cookies,它允许您继续执行脚本:

$cookiesEnabled = true;

if (!isset($_COOKIE['mycookie'])) {
    $cookiesEnabled = false;
    if (!isset($_GET['cookie_test'])) {
        setcookie('mycookie', 1, 0, '/');
        @ob_end_clean();
        $_SESSION['original_url'] = $_SERVER['REQUEST_URI'];
        $uri = $_SERVER['REQUEST_URI'];
        $uri = explode('?', $uri);
        $q = (isset($uri[1]) && $uri[1])?explode('&', $uri[1]):array();
        $q[] = 'cookie_test=1';
        $uri[1] = implode('&', $q);
        $uri = implode('?', $uri);
        header('Location: '.$uri);
        die;        
    }
} else if (isset($_GET['cookie_test'])) {
    @ob_end_clean();
    $uri = $_SESSION['original_url'];
    unset($_SESSION['original_url']);
    header('Location: '.$uri);
    die;    
}

// if (!$cookiesEnabled) ... do what you want if cookies are disabled

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接