1

很像Detect if cookies are enabled in PHP and Check if cookies are enabled中问的问题,我想知道是否启用了cookies。

但是,我试图使这对用户尽可能透明,因此我对将一些“cookietest = 1”参数附加到我的 URL 不感兴趣。

我知道我可以重定向回用户最初输入的页面,取消设置“cookietest = 1”GET参数,并通过会话告诉原始页面是否禁用cookie,但是......

我目前正在使用 CodeIgniter 并且不想弄乱 CodeIgniter 会话,因此不使用 PHP 会话来存储 cookie 启用/禁用状态。

我实际上不确定使用 PHP 会话是否会弄乱 CodeIgniter 会话,但即使没有,我仍然想知道是否有一些巧妙的解决方案,可以在不设置 GET 参数的情况下进行 cookie 检查或使用会话(但是重定向很好)?

更新

看来我需要澄清一点:

我想知道客户端是否启用了cookie 。我已经尝试过我链接到的问题中描述的方法,即:

  1. 设置饼干。
  2. 重定向到检查 cookie PHP 页面或使用“cookietest=1”GET 参数的同一页面。
  3. 查看 cookie 是否仍然设置:如果是 => 万岁,cookie 正在工作!否则 => 嘘,cookie 被禁用。

我要问的是是否可以在不设置 GET 参数的情况下执行此操作(因为这在 URL 中可见)。该问题的答案是“是的,如果您使用 PHP 会话”。

我的下一个问题是:是否可以不设置 GET 参数并且不使用 PHP 会话?

4

4 回答 4

1

基础知识:在您向客户端发送一个 cookie 并从他那里收到相同的信息之前,您无法知道用户是否启用了 cookie。

所以流程:

  • 客户要求
  • 服务器响应(+ cookie)
  • 客户端请求(+ cookie)

无论如何都无法避免

您可以使用某些测试请求(ajax、图像等)跟踪是否启用了 cookie

例如,您可以使用简单的 1px 图像或从您的 php 脚本提供的任何徽标图像,并且您可以跟踪是否启用了 cookie。

所以现在的流程是:

  • 客户要求
  • 服务器响应 HTML (+ cookie)
  • 客户端请求远程页面资源(js、img、css)(+cookie)
  • 请求页面资源的服务器响应

就像是

<?php 
    // domain.com/some.js
    if (isset($_COOKIE['test']))
         $_SESSION['cookies_enabled'] = true;

    echo <<JS
    <someJS code or nothing>
    JS;
 ?>
于 2013-02-21T12:16:10.863 回答
1

不久前我对此进行了很多研究,似乎每一种方式都有其缺陷。我还考虑到的一件事是,如果用户要更新页面或通过后退按钮返回页面,cookie 检查将如何工作。

HTTP request显然,为了让服务器查看客户端是否接受 cookie,客户端必须在服务器尝试设置 cookie 后发送附加信息,服务器在其中查找指示客户端接受 cookie 的 cookie 标头(没有标头 =不接受cookies)。这个额外的请求可以重定向到另一个页面(参见通常的方法,其中一个$_GET参数作为一个标志,说明是否尝试设置 cookie)但重要的是它实际上只是另一个 HTTP 请求。我最终做的是将整个页面包装在一个HTML FRAMESET

<?php
    setcookie('test', 1, time() + 3600);
    echo '<HTML>
        <HEAD>
            <TITLE>
            </TITLE>
        </HEAD>
        <frameset rows="100%" cols="100%">
            <frame src="next.php">
        </frameset>
    </HTML>';
?>

...然后我知道如果客户端已HTTP request接受next.phpcookie,请求中将包含一个 cookie 标头,因此我不必使用$_GET参数作为指示这一点的标志。Next.php因此看起来像:

<?php
    if(count($_COOKIE) > 0){
        //Set some variable that indicates to the rest of the script that cookies 
        //are enabled.
    }
    else {
        //Set some variable indicating that cookies are disabled
    }
    //Output the rest of the script and HTML code to be displayed
?>

我想过做同样的事情,但从标签而不是HTTP request从标签发送附加信息,但我遇到了麻烦,我将如何通过图像向父脚本指示是否设置了 cookie,因此我最终这样做了. 我在这种方法中看到的唯一缺陷是,如果用户在框架内右键单击并选择仅更新框架(而不是整个页面),那么框架将错误地声称 cookie 被禁用,但与所有的缺点相比其他方式,我认为这是可以接受的。IMGFRAMESET

编辑:我还应该补充一点,我也指出在没有 Javascript 的情况下这样做。

于 2013-04-30T09:27:44.970 回答
0

我会使用 php.ini 设置来找出这些东西。也许是这样的:

if (ini_get("session.use_cookies") == 1) {
  print "cookies enabled";
}
于 2013-02-21T12:02:42.470 回答
0

虽然您可以检查 php 是否启用了 cookie,但一个非常简单的测试就是设置一个 cookie,然后尝试读取它。

如果你成功阅读它,它就起作用了。如果客户端不允许使用 cookie,这也会通知您。

于 2013-02-21T12:34:26.500 回答