与Detect if cookies are enabled in PHP和Check if cookies are enabled中提出的问题非常相似,我想知道是否启用了Cookie。
然而,我试图让用户尽可能透明,因此我对我的网址附加一些“cookietest = 1”参数不感兴趣。
我知道我可以重定向回用户最初输入的页面,取消设置“cookietest = 1”GET参数,如果通过会话禁用cookie,只需告诉原始页面,但是......
我目前正在使用CodeIgniter并且不想搞乱CodeIgniter会话,因此不使用PHP会话来存储cookie启用/禁用状态。
我实际上不确定使用PHP会话是否会弄乱CodeIgniter会话,但即使它不是,我仍然有兴趣知道是否有一些巧妙的解决方案,那可以在没有设置的情况下进行cookie检查一个GET参数或使用会话(但重定向很好)?
更新
似乎我需要澄清一点:
我想知道Cookie是否已启用客户端。我已经尝试过我所链接的问题中描述的方法,即:
我要问的是,是否可以在不设置GET参数的情况下执行此操作(因为这在URL中可见)。这个问题的答案是“是的,如果你使用PHP会话”。
我的下一个问题是:如果不使用PHP会话,是否可以不设置GET参数?
答案 0 :(得分:1)
基础知识:在您向客户端发送一个cookie并从中回复之前,您无法知道用户是否启用了Cookie。
所以流程:
您可以使用某些测试请求(ajax,图像等)跟踪是否启用了Cookie
例如,您可以使用简单的1px图像或从您的php脚本提供的任何徽标图像,您可以跟踪是否启用了Cookie。
现在流程是:
像
这样的东西<?php
// domain.com/some.js
if (isset($_COOKIE['test']))
$_SESSION['cookies_enabled'] = true;
echo <<JS
<someJS code or nothing>
JS;
?>
答案 1 :(得分:1)
我刚才看了很多,似乎每个方面都有它的缺陷。我考虑的一件事是,如果用户要更新页面或通过后退按钮返回页面,cookie检查将如何工作。
显然,要让服务器查看客户端是否接受cookie,客户端必须在服务器尝试设置cookie之后再发送HTTP request
,其中服务器会查找cookie标头,指示客户接受cookie(没有标头=不接受cookie)。这个额外的请求可以重定向到另一个页面(参见通常的方法,$_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.php
我知道如果客户已接受Cookie,请求中会包含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
标记而不是IMG
发送了额外的FRAMESET
但是我遇到了如何向父脚本指示的问题通过图像是否设置了cookie,因此我最终这样做了。我在这种方法中看到的唯一缺陷是,如果用户右键单击框架并选择仅更新框架(而不是整个页面),那么框架将错误地声明cookie被禁用但是与所有框架的缺点相比较其他方式,我认为这是可以接受的。
编辑:我还应该补充一点,我在没有Javascript的情况下做了这个。
答案 2 :(得分:0)
我会用php.ini设置找出这样的东西。 也许是这样的:
if (ini_get("session.use_cookies") == 1) {
print "cookies enabled";
}
答案 3 :(得分:0)
虽然你可以检查php是否启用了cookie,但是一个非常简单的测试就是设置一个cookie,然后尝试阅读它。
如果你成功阅读它,它就有用了。 如果客户端不允许使用cookie,也会通知您。