代码之家  ›  专栏  ›  技术社区  ›  Dalen

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

  •  0
  • Dalen  · 技术社区  · 9 年前

    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就不起作用了。一、 e.即使设置了一些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 回复  |  直到 9 年前
        1
  •  1
  •   Ali Nikneshan    9 年前

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

        2
  •  0
  •   Dalen    9 年前

    抱歉打扰了大家。

    在域前面添加点“.”:

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

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

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

    此外,My Firefox对许多测试感到困惑,所以即使使用点前缀,它也不会返回它,因为域前缀为点的cookie和不带点的cokie被认为是两个不同的cookies,即使它们应该在相同的站点上触发。cookie的值,即其名称name=Value显然未被计算。

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

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

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