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

时间:2016-01-01 22:47:30

标签: python http cookies cgi

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/html\n"
print "<h1>Some HTML, blah blah...</h1><br>"
print "Tuple (rated, asked, posted):", (rated, asked, posted)

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

很抱歉打扰所有人。

添加点“。”在域名前面:

func killCoins() {
    for child in self.children where child is SKSpriteNode {
        if child.name == "coin" {
            child.removeFromParent()
        }
    }
}

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

此外,这没有多大意义,因为在http://example.com/etc网址中没有提到点...

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

注意1:.example.com将为example.com的每个子域发送cookie,而不仅仅是www,因此请指定控制它的路径。

注意2:如果您没有设置cookie的域属性,浏览器不会为子域设置它,只针对域,因此,如果您希望它适用于子域,则必须进行设置。

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