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

时间:2015-01-21 13:30:21

标签: php cookies

我到处搜索并尝试了一切。 如果您登录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'];

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

2 个答案:

答案 0 :(得分:0)

您的浏览器不允许您为比您当前所使用的网址“更高”的域设置Cookie。您正尝试在r4ge.ro上设置Cookie,当您 on {/ em> r4ge.ro时,该功能正常,但是当您从www.r4g3.ro加载页面时,您可以仅为www.r4ge.ro或以下设置Cookie(例如foo.www.r4ge.ro)。如果你想象你有一个网站example.co.uk就会变得更加明显,并且在那个网站上你试图为co.uk域设置一个cookie:这肯定是危险的,因为那个cookie可以被读取(并且用于跟踪任何 .co.uk域中的浏览习惯。

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

答案 1 :(得分:0)

我会继续回答这个,即使答案也不尽如人意。

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

  • 为www和非www(哑)

  • 创建两个单独的Cookie
  • 使用.htaccess从www重定向到非www(仍然很愚蠢,但显然每个人都这样做,因为有重复的内容[你甚至可以尝试www.stackoverflow.com])

为了解决此问题的其他所有人谷歌搜索,这里是您需要添加到.htaccess的脚本,以便在不指定域名的情况下从www重定向到非www。

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

如果有人知道cookie问题的答案,请发布。