setcookie() 不在 www.domain.tld 上创建 cookie,但在 domain.tld 上工作

setcookie() doesn't create cookie on www.domain.tld but works on domain.tld

我到处搜索并尝试了一切。 如果您在 http://r4ge.ro 上登录,它会起作用。如果您访问 www.r4ge.ro,cookie 将被读取并起作用。 如果您注销,请尝试登录 www。r4ge.ro 永远不会创建 cookie。

    $data = "name=" . $jucatoru . "&pass=" . md5($passw);
    $date_of_expiry = time()+60*60*24 ;
    setcookie ( $cookie, $data, $date_of_expiry, "/", ".r4ge.ro");
    echo "Succesfully logged in";
    exit();

我已经检查过了,这不是读取问题,如果您尝试从 www.r4ge.ro 登录,cookie 不存在。在 chrome 和 firefox 上测试(站点在 IE 上不工作)

注销是这样完成的

    $date_of_expiry = time() - 60 ;
    setcookie( $cookie, "nothing", $date_of_expiry, "/", ".r4ge.ro");
    echo "Succesfully logged out!

这就是读取 cookie 的方式

$data = $_COOKIE[$cookie];
parse_str($data, $output);
$name = $output['name'];
$pass = $output['pass'];

测试凭据:test : test1 如果你想自己试试

您的浏览器不允许您为 'higher' 比您当前所在 URL 的域设置 cookie。您正在尝试在 r4ge.ro 上设置 cookie,当您在 r4ge.ro 时它工作正常,但是当您从 www.r4g3.ro 加载页面时] 您只能为 www.r4ge.ro 或以下(例如 foo.www.r4ge.ro)设置 cookie。如果您假设您有一个站点 example.co.uk,并且您试图在该站点上为 co.uk 域设置一个 cookie,那么这将变得更加明显:这肯定是危险的,因为该 cookie 可能随后被读取(并用于跟踪您的浏览习惯)来自 any .co.uk 域。

如果您省略 setcookie() 中的最后一个参数,那么它将设置为当前站点,这将起作用(如果您登录 www 子域,您将不会登录顶级域,但所有其他排列都有效)。

我会继续回答这个问题,即使答案非常不令人满意。

我已经写信给我的托管服务提供商,他们提供了两种解决方案:

  • 为 www 和非 www(愚蠢)创建两个单独的 cookie

  • 使用 .htaccess 从 www 重定向到非 www(仍然愚蠢,但显然每个人都这样做,因为 hurr durr 重复内容[你甚至可以尝试 www.whosebug.com])

为了让每个人都遇到这个问题,再次 google 搜索,这是您需要添加到 .htaccess 中的脚本,以便在不指定域的情况下从 www 重定向到非 www。

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/ [R=301,L]

如果有人知道 cookie 问题的答案,请 post 也知道。