我尝试通过 jsjQuery.cookie
为所有当前子域设置一个 cookie,像这样
$.cookie('account', 'myvalue', { path: '/', domain: '.domain.com' });
事情是window.location.hostname
会返回www.domain.com
或domain.com
取决于它的上下文。
如果出现在“。”中,是否有任何方法可以简单地替换子域?如果不存在子域仍然显示 . 一开始?
我尝试通过 jsjQuery.cookie
为所有当前子域设置一个 cookie,像这样
$.cookie('account', 'myvalue', { path: '/', domain: '.domain.com' });
事情是window.location.hostname
会返回www.domain.com
或domain.com
取决于它的上下文。
如果出现在“。”中,是否有任何方法可以简单地替换子域?如果不存在子域仍然显示 . 一开始?
问题问“什么是最快的方法”,所以这是最快的方法,因为它使用最少的代码行,并且不会增加 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('.');
}
对于以下任何值:
以下将起作用:
"." + 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