2

我尝试通过 jsjQuery.cookie为所有当前子域设置一个 cookie,像这样

$.cookie('account', 'myvalue', { path: '/', domain: '.domain.com' });

事情是window.location.hostname会返回www.domain.comdomain.com取决于它的上下文。

如果出现在“。”中,是否有任何方法可以简单地替换子域?如果不存在子域仍然显示 . 一开始?

4

2 回答 2

1

问题问“什么是最快的方法”,所以这是最快的方法,因为它使用最少的代码行,并且不会增加 JavaScript 对函数或 for 循环的上下文切换的开销:

var domain = window.location.hostname;
var parts = domain.split('.');
var isIpAddress;

// Decide whether host is IP address
isIpAddress = /[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}/.test(domain);

// If it's an IP, then use full host name,
// otherwise just use last two values of the dot-delimited host name array
if(isIpAddress)
    domain = window.location.hostname;
else
{
    if(parts.length <= 3)
       domain = '.'+window.location.hostname;
    else
       domain = '.'+window.location.hostname.split('.').slice(1).join('.');
}
于 2013-08-10T20:46:08.030 回答
1

对于以下任何值:

  • any.number.of.host.names.here.foo.domain.com
  • foo.domain.com
  • 域名.com

以下将起作用:

"." + window.location.hostname.split('.').slice(-2).join('.');

在这种情况下会有很多localhost人返回。.localhost我不完全确定这方面的最佳行为。请参阅:具有显式域的 localhost 上的 Cookie

如果您需要将 IP 地址作为主机名来查找,则需要添加更多逻辑来确定它是否是 IP 地址。

更好的方法可能是:

function getDomain() {
    var path = window.location.hostname.split('.');

    // See above comment for best behavior...
    if(path.length === 1) return window.location.hostname;

    if(path.length === 4 && isIPAddress(path)) return window.location.hostname;

    return "." + window.location.hostname.split('.').slice(-2).join('.');
}

// doesn't check for ip V6
function isIPAddress(path) {
    for(var i = 0; i < path.length; ++i) {
        if(path[i] < 0 || path[i] > 255) {
            return false;
        }
    }

    return true;
}

重要的

正如@Hiroto 在其中一条评论中指出的那样,请确保您知道将在哪个域上使用此逻辑。为 设置 cookie 不是一个好主意.co.uk。有关此问题的有趣阅读,请参阅:Mozilla Bug 252342:修复 cookie 域检查以不允许 .co.uk

于 2013-08-10T20:46:47.237 回答