我维护一个电子商务网站的代码,他们使用osCommerce v2.2 RC2的高度修改版本。注意到会话在新用户访问网站的第2页之前未启动的问题。使用setcookie检测cookie集没有页面重装
查看代码,在开始会话之前,它会尝试设置一个cookie。如果它检测到它启动会话的cookie。沿着这条线的东西:
setcookie('cookie_test', 'please_accept_for_session', time()+60*60*24*30, $cookie_path, $cookie_domain);
if (isset($_COOKIE['cookie_test'])) {
session_start();
...
我发现这里的article谈到有关这样的情况下,它指出:
第一次只告诉浏览器设置cookie,在当时,请求头中没有cookie数据(可以从$ _COOKIE获得)。
这解释了为什么需要两个页面加载才能启动会话。一个设置cookie,另一个从浏览器获取cookie的设置。
我的问题是,究竟有没有经过两次页面加载来检测cookie是否成功设置在用户浏览器上?
我发现这个question并没有完全回答我的问题。投票最高的解决方案是:
setcookie('uname', $uname, time()+60*30);
$_COOKIE['uname'] = $uname;
这可能使“工作”,但它并没有忠实地告诉我,该脚本能够成功设置cookie。
我也发现了这个question,即建议访问headers_list找到Cookie信息,像这样:
function getcookie($name) {
$cookies = [];
$headers = headers_list();
// see http://tools.ietf.org/html/rfc6265#section-4.1.1
foreach($headers as $header) {
if (strpos($header, 'Set-Cookie: ') === 0) {
$value = str_replace('&', urlencode('&'), substr($header, 12));
parse_str(current(explode(';', $value, 1)), $pair);
$cookies = array_merge_recursive($cookies, $pair);
}
}
return $cookies[$name];
}
// [...]
setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . getcookie('uname');
这又似乎并没有被验证cookie的设置成功。所有这些似乎都是搜索正在发送给浏览器的cookie值的cookie值。
我能想到的唯一解决方案是在设置cookie之后重定向第一次访问。有没有其他方法?
无条件启动会话...?如果您需要,您仍然可以检查以后是否接受Cookie。 – CBroe
我在想这是我唯一的选择。我查看了JavaScript cookie验证,但由于JavaScript可以禁用,我不喜欢这种方法。我感到惊讶的是,这个过程似乎没有任何行业广泛接受的方法。 在设计网站及其互动时,如果您接受当前验证的“接受方法”,则在进行验证之前,首次访问总是必须分两步进行。例如,如果您正在将某人发送到某个页面,那么您需要立即捕获某些内容给该会话? – peteb
会话可以在没有cookie的情况下工作(并且作为默认的回退,他们通常会这样做 - 直到自动确定cookie支持为止)。 – CBroe