为什么当域以 www 开头时,此 cookie 不返回到指定的路径?



Cookie仅适用于没有www.前缀的域。为什么?

当用户位于用查询字符串标识的路径上时,我希望将我的cookie发送到服务器。路径始终是相同的CGI脚本。

问题是,当有问题的页面被调用为:时,以下代码可以完美地工作

http://example.com/cgi-bin/something.py?q=some_query_key

但当它被称为:

http://www.example.com/cgi-bin/something.py?q=some_query_key

那么设置的cookie就不起作用了。也就是说,即使设置了一些cookie,当页面再次加载时,它也不会返回到服务器。

import cgi
import cgitb
cgitb.enable()
import Cookie,
import datetime
import os
def setcookie (q, rated, asked, posted):
    expiration = datetime.datetime.now() + datetime.timedelta(days=3650)
    cookie = Cookie.SimpleCookie()
    cookie["session"] = "%i:%i:%i" % (rated, asked, posted)
    cookie["session"]["domain"] = "example.com"
    cookie["session"]["path"] = "/cgi-bin/something.py?q="+q
    cookie["session"]["expires"] = expiration.strftime("%a, %d-%b-%Y %H:%M:%S P$
    print cookie.output()
rated, asked, posted = (0, 0, 0)
if not os.environ.has_key("HTTP_COOKIE"):
    setcookie("some_query_key", 1, asked, posted)
else:
    cookie = Cookie.SimpleCookie(os.environ["HTTP_COOKIE"])
    rated, asked, posted = map(int, cookie["session"].value.split(":"))
print "Content-Type: text/htmln"
print "<h1>Some HTML, blah blah...</h1><br>"
print "Tuple (rated, asked, posted):", (rated, asked, posted)

这是一个示例代码,因此不包括错误处理,而是使用虚拟域和路径。

有人知道这里发生了什么吗。我在Mozilla Firefox上。

您需要将cookie设置为.example.com而不是example.com才能从子域访问。

很抱歉打扰大家。

在域前面添加一个点".":

cookie["session"]["domain"] = ".example.com"

真的很管用。我知道点前缀,但我不知道www被视为子域,即使它是在全局DNS中定义的。

此外,这也没有太大意义,因为URL中没有提到这个点http://example.com/etc...

此外,我的Firefox与许多测试相混淆,因此即使使用句点前缀,它也不会返回它,因为带有句点前缀的域和没有句点的域的cookie被认为是两种不同的cookie,即使它们应该在相同的网站上触发。cookie的值,即名称=值的名称,显然未进行评估。

注意1:example.com会为example.com的每个子域发送cookie,而不仅仅是www,所以指定路径来很好地控制它。

注意2:如果你不设置cookie的域属性,浏览器不会为子域设置它,只为域设置,所以,如果你想让它为子域工作,你必须设置它。

我决定不删除这个Q,而是给一个A,这样其他人在遇到这个问题时可以得到更多的解释。

最新更新