【问题标题】:Can I use localhost as the domain when setting an HTTP cookie?设置 HTTP cookie 时可以使用 localhost 作为域吗?
【发布时间】:2009-01-28 21:06:12
【问题描述】:

我正在使用 jQuery 插件来设置 cookie,当我使用 localhost 作为域时,它不会存储 cookie。

这是我在 jQuery 1.2.6 中使用的插件。

http://www.stilbuero.de/2006/09/17/cookie-plugin-for-jquery/

以下是我正在使用的代码。您可以看到它不喜欢 localhost,我是从 localhost 上的开发 Web 服务器运行它。一个细节是我正在运行端口 4005,但这不应该影响域,AFAIK。

$(function() {

    console.log('Testing');

    var one = $.cookie('Test.One');
    var two = $.cookie('Test.Two');
    var three = $.cookie('Test.Three');

    console.log(['one', one]);
    console.log(['two', two]);
    console.log(['three', three]);

    $('#div1').text(one);
    $('#div2').text(two);
    $('#div3').text(three);

    $.cookie('Test.One', 'Test 1');
    $.cookie('Test.Two', 'Test 2', { path: '/' });
    $.cookie('Test.Three', 'Test 3', { path: '/', domain: 'localhost' });

});

【问题讨论】:

    标签: javascript jquery cookies


    【解决方案1】:

    我在设置 cookie 时遇到了类似的问题。组成一个域名并将其作为 127.0.0.1 添加到您的主机文件中。然后在该域上运行 Web 应用程序。

    【讨论】:

    • 是的,我应该阅读这篇文章,而不是浪费 2 小时 ;-) “localhost”绝对是一个不好的价值!
    • 只需使用“lvh.me”。该域名已经指向 127.0.0.1
    【解决方案2】:

    我认为 cookie 的域名必须正好有两个点(不包括 TLD 之后的最后一个点)。所以.something.localhost 可以,.google.com 可以,但.localhostgoogle.com 不行。但是看一眼RFC 2965 就会发现它比这更复杂……您可能想阅读该文档,尤其是第 3.3 节(和/或其前身,RFC 2109)。

    【讨论】:

    • 真的吗?我以为你可以为 example.com 设置 cookie,并且它们会被发送到所有 example.com 域(例如 www.example.com,actually-we-didnt-need-the-cookie-here-but -you-sent-it-anyway-what-a-waste-of-bandwidth-eh.example.com)
    • 一个相关的部分是这样的:A Set-Cookie2 from request-host example for Domain=.local will be accepted, because the effective host name for the request-host is example.local, and example.local domain-matches .local. 它只需要接受.localhost。而不是 .local.
    • 请注意,虽然 set-cookie2 已过时,但它仍然存在于 Java 的 HTTPCookie 中,这就是我到达这里的方式。这意味着受此影响的 +1B 设备。
    【解决方案3】:

    我更新了 jQuery 插件,当它是 localhost 时不将域添加到 cookie。这解决了我的问题,而无需触及主机文件。

    var domain = (options.domain && options.domain !== 'localhost') ? '; domain=' + (options.domain) : '';
    

    【讨论】:

      【解决方案4】:

      我正在使用 Code Ignitor,并将域设置为空字符串解决了我在 localhost 上处理应用程序时遇到的问题。我相信这是更好的解决方案,因为开发团队中的每个人都不需要在 Windows 上弄乱他们的主机文件。

      在现场部署时,生产域值可以放在 Code Ignitor 的 config.php 中。

      【讨论】:

      • +1 这工作并且在不同的开发机器上是灵活的。对我来说,这看起来像... document.cookie = "MyCookie=" + yourCookieValueHere + ";domain=";
      【解决方案5】:

      我尝试将主机文件设置为使用备用名称 (local.acme.com),现在我可以在该域上设置 cookie。似乎我无法在 localhost 上设置 cookie,至少不能使用 Firefox。我不记得这是对 cookie 的限制。我想了解这里发生了什么。

      另外,我确实尝试将主机文件中的域简单地设置为“dev”,但这不起作用。我必须使用以 .com 或其他顶级域名结尾的名称才能使其正常工作。

      【讨论】:

      • 是的,它仅适用于完全限定的域名。我想这与为多个域名设置相同 cookie 的需要有关,例如www1.domain.com, www2.domain.com,所以需要设置域为.domain.com的cookie。
      • 正如我在回答中指出的那样,RFC 声明它与域名中的点数有关,而不是它是否完全合格。
      【解决方案6】:

      对我来说解决这个问题的最简单的解决方案是使用 127.0.0.1 而不是 localhost ;-) 这在 Firefox 中运行良好!

      【讨论】:

        【解决方案7】:

        Cookie 需要指定SameSite 属性,None 值曾经是默认值,但最近的浏览器版本将Lax 设置为默认值,以便对某些类别的跨站请求伪造 (CSRF) 具有相当强大的防御能力攻击。

        除了Domain=localhost,您的 cookie 应该看起来像这样

        document.cookie = `${name}=${value}${expires}; Path=/; Domain=localhost; SameSite=Lax`;
        

        https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite

        【讨论】:

          猜你喜欢
          • 2012-01-16
          • 2019-07-31
          • 2014-12-22
          • 2019-08-09
          • 2014-03-08
          • 2013-03-02
          • 1970-01-01
          • 1970-01-01
          • 2014-12-21
          相关资源
          最近更新 更多