Cookies on localhost with explicit domain

前端 未结 21 1779
[愿得一人]
[愿得一人] 2020-11-22 04:17

I must be missing some basic thing about cookies. On localhost, when I set a cookie on server side and specify the domain explicitly as localhost (or .localhost). t

相关标签:
21条回答
  • 2020-11-22 04:52

    When a cookie is set with an explicit domain of 'localhost' as follows...

    Set-Cookie: name=value; domain=localhost; expires=Thu, 16-Jul-2009 21:25:05 GMT; path=/

    ...then browsers ignore it because it does not include at least two periods and is not one of seven specially handled, top level domains.

    ...domains must have at least two (2) or three (3) periods in them to prevent domains of the form: ".com", ".edu", and "va.us". Any domain that fails within one of the seven special top level domains listed below only require two periods. Any other domain requires at least three. The seven special top level domains are: "COM", "EDU", "NET", "ORG", "GOV", "MIL", and "INT".

    Note that the number of periods above probably assumes that a leading period is required. This period is however ignored in modern browsers and it should probably read...

    at least one (1) or two (2) periods

    Note that the default value for the domain attribute is the host name of the server which generated the cookie response.

    So a workaround for cookies not being set for localhost is to simply not specify a domain attribute and let the browser use the default value - this does not appear to have the same constraints that an explicit value in the domain attribute does.

    0 讨论(0)
  • 2020-11-22 04:54

    Tried all of the options above. What worked for me was:

    1. Make sure the request to server have withCredentials set to true. XMLHttpRequest from a different domain cannot set cookie values for their own domain unless withCredentials is set to true before making the request.
    2. Do not set Domain
    3. Set Path=/

    Resulting Set-Cookie header:

    Set-Cookie: session_token=74528588-7c48-4546-a3ae-4326e22449e5; Expires=Sun, 16 Aug 2020 04:40:42 GMT; Path=/
    
    0 讨论(0)
  • 2020-11-22 05:00

    Spent a great deal of time troubleshooting this issue myself.

    Using PHP, and Nothing on this page worked for me. I eventually realized in my code that the 'secure' parameter to PHP's session_set_cookie_params() was always being set to TRUE.

    Since I wasn't visiting localhost with https my browser would never accept the cookie. So, I modified that portion of my code to conditionally set the 'secure' param based on $_SERVER['HTTP_HOST'] being 'localhost' or not. Working well now.

    I hope this helps someone.

    0 讨论(0)
  • 2020-11-22 05:00

    The only thing that worked for me was to set Path=/ on the cookie.

    Moreover, the default value of a path attribute seems to be different from browsers to browsers although I tested only two of them (Firefox and Chrome).

    Chrome tries to set a cookie as is; if path attribute is omitted in Set-Cookie header then it will not be stored and ignored.

    However, Firefox stores a cookie even without an explicit path attribute. It just set it with the requested path; my request url was /api/v1/users and the path was set to /api/v1 automatically.

    Anyway, both browsers worked when path was set to / even without an explicit domain, ie Domain=localhost or something. So there are some differences in the way how each browser handles cookies.

    0 讨论(0)
  • 2020-11-22 05:00

    Another important detail, the expires= should use the following date time format: Wdy, DD-Mon-YYYY HH:MM:SS GMT (RFC6265 - Section 4.1.1).

    Set-Cookie:
      name=value;
      domain=localhost;
      expires=Thu, 16-07-2019 21:25:05 GMT;
      path=/
    
    0 讨论(0)
  • 2020-11-22 05:01

    By design, domain names must have at least two dots; otherwise the browser will consider them invalid. (See reference on http://curl.haxx.se/rfc/cookie_spec.html)

    When working on localhost, the cookie domain must be omitted entirely. Just setting it to "" or NULL or FALSE instead of "localhost" is not enough.

    For PHP, see comments on http://php.net/manual/en/function.setcookie.php#73107.

    If working with the Java Servlet API, don't call the cookie.setDomain("...") method at all.

    0 讨论(0)
提交回复
热议问题