Cookie“ _shopify_country”来自哪里?

时间:2019-04-06 06:11:15

标签: javascript cookies shopify

我想基于Slate重定向到与我的Shopify网站中用户正在浏览的国家/地区相关的商店。

在研究过程中,我发现了一个名为_shopify_country的cookie,其值设置为用户所在的国家/地区,但由于它是undocumented,因此我害怕使用此cookie。

我有两个问题:

  1. _shopify_country设置在哪里?
  2. 如何使用javascript重定向到与该Cookie关联的网站?在设置之前,我应该轮询 cookie吗?

1 个答案:

答案 0 :(得分:0)

我已经浏览了一些Shopify网站,但找不到_shopify_country cookie。似乎从来没有设置过,所以我想这是一个自定义修改以获取它,或者可能是不推荐使用的功能。

但是,如果您的目标是确定用户来自哪个国家/地区,则只需向GEOIP服务提交AJAX请求。我倾向于用于GEO查询的API是https://www.geojs.io,这是一个免费的未经身份验证的GEO查询,

通常,您会显示一条横幅,提示他们更改为本地站点,而不是重定向自己。对于拥有VPN的情况/他们正在国外购买商品

由于从客户端触发了AJAX请求,它将从示例中返回其IP /信息,您可以在控制台中尝试使用它们。

获取IP

fetch('https://canihazip.com/s')
    .then(response => response.text())
    .then(body => alert(body))

获取国家/地区代码

fetch('https://get.geojs.io/v1/ip/country')
    .then(response => response.text())
    .then(body => alert(body))

但是回到问题所在,如果您想根据国家/地区代码进行重定向,可以执行类似的操作

fetch('https://get.geojs.io/v1/ip/country')
    .then(response => response.text())
    .then(country_code => {
        // Save as a cookie in case we want to use it later / in another page
        var date = new Date(); date.setMonth(date.getMonth()+1); date = date.toUTCString();
        document.cookie = `_visitor_country=${country_code}; expires=${date}; path=/`;

        var domain_and_tld = window.location.host.split('.').splice(-2).join('.');
        country_code = country_code.trim().toLowerCase();

        switch (country_code) {
            case 'gb':
                window.location.host = domain_and_tld;
                break;
            case 'us':
                window.location.host = `us.${domain_and_tld}`;
                break;
            case 'fr':
                window.location.host = `fr.${domain_and_tld}`;
                break;
        };
    })
    .catch(err => console.error(err));

以上代码,但与ES5一样/具有对旧版浏览器的支持

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://get.geojs.io/v1/ip/country');
xhr.send();
xhr.onload = function() {
    if (xhr.status != 200)
        return console.error('Error '+xhr.status+': '+xhr.statusText);

    var country_code = xhr.response.trim().toLowerCase();

    // Save as a cookie, so we can reference this later if we want to
    var date = new Date(); date.setMonth(date.getMonth()+1); date = date.toUTCString();
    document.cookie = '_visitor_country='+country_code+'; expires='+date+'; path=/';

    var domain_and_tld = window.location.host.split('.').splice(-2).join('.');
    switch (country_code) {
        case 'gb':
            window.location.host = domain_and_tld;
            break;
        case 'us':
            window.location.host = 'us.'+domain_and_tld;
            break;
        case 'fr':
            window.location.host = 'fr.'+domain_and_tld;
            break;
    }
};

xhr.onerror = function() {
    console.error('Request failed');
};