2

jQuery.cookieこのような現在のすべてのサブドメインを使用して、js経由でCookieを設定しようとしています

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

問題は、そのコンテキストに応じて、またはwindow.location.hostname返されることです。www.domain.comdomain.com

「。」に存在する場合、サブドメインを単純に置き換える方法はありますか? サブドメインが存在しない場合でも、. 最初に?

4

2 に答える 2

1

質問は「最も速い方法は何ですか」と尋ねたので、コードの行数が最も少なく、JavaScript が for 関数または 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

次のいずれかの値:

  • 任意の数のホスト名.here.foo.domain.com
  • foo.domain.com
  • domain.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;
}

重要

コメントの 1 つで @Hiroto が指摘したように、このロジックが使用されるドメインを確認してください。に Cookie を設定するのは得策ではありません.co.uk。この問題に関する興味深い読み物については、Mozilla Bug 252342: fix cookie domain checks to not allow .co.uk を参照してください。

于 2013-08-10T20:46:47.237 に答える