web-dev-qa-db-ja.com

サブドメインを取得し、グリースモンキーでURLにロードします

私はURL http://somesubdomain.domain.com を持っています(サブドメインは異なる場合があり、ドメインは常に同じです)。サブドメインを取得し、greasemonkeyを使用してdomain.com/some/path/here/somesubdomainなどのページをリロードする必要があります(またはURL domain.com/some/path/here/somesubdomainで新しいウィンドウを開きます)。

28
user157011
var full = window.location.Host
//window.location.Host is subdomain.domain.com
var parts = full.split('.')
var sub = parts[0]
var domain = parts[1]
var type = parts[2]
//sub is 'subdomain', 'domain', type is 'com'
var newUrl = 'http://' + domain + '.' + type + '/your/other/path/' + subDomain
window.open(newUrl);
48
Derek Swingley

Derekが提供する回答は、最も一般的なケースでは機能しますが、「xxx.xxx」サブドメインや「Host.co.uk」では機能しません。 (また、window.location.Hostを使用すると、処理されないポート番号も取得されます: http://www.w3schools.com/jsref/prop_loc_Host.asp

正直なところ、この問題の完全な解決策はありません。個人的には、ホスト名を分割する方法を作成しました。これは、多数のホスト名をカバーするため、私が頻繁に使用する方法です。

このメソッドは、ホスト名を{domain: "", type: "", subdomain: ""}に分割します

function splitHostname() {
        var result = {};
        var regexParse = new RegExp('([a-z\-0-9]{2,63})\.([a-z\.]{2,5})$');
        var urlParts = regexParse.exec(window.location.hostname);
        result.domain = urlParts[1];
        result.type = urlParts[2];
        result.subdomain = window.location.hostname.replace(result.domain + '.' + result.type, '').slice(0, -1);;
        return result;
}

console.log(splitHostname());

このメソッドは、サブドメインのみを文字列として返します。

function getSubdomain(hostname) {
        var regexParse = new RegExp('[a-z\-0-9]{2,63}\.[a-z\.]{2,5}$');
        var urlParts = regexParse.exec(hostname);
        return hostname.replace(urlParts[0],'').slice(0, -1);
}

console.log(getSubdomain(window.location.hostname));
// for use in node with express:  getSubdomain(req.hostname)

これらの2つの方法は、ほとんどの一般的なドメイン(co.ukを含む)で機能します[〜#〜]注[〜#〜]sliceサブドメインの最後には、余分なドットを削除します。

これで問題が解決することを願っています。

17
Vlad Filip

ここで提供されているソリューションは、どこかで機能することもありますが、ほとんどの場合は機能します。私の知る限りでは、anyドメインの完全なサブドメインを見つける最良の方法(そして、サブドメインにもピリオドが含まれていることがあります!サブサブドメインがあるなど)は、Mozillaによって管理されている Public Suffix List を使用することです。

パブリックサフィックスリストにないURLの部分は、ドットで結合されたサブドメインとドメイン自体です。パブリックサフィックスを削除したら、ドメインを削除して、ドット間の最後のセグメントを削除することでサブドメインだけを残すことができます。

複雑な例を見てみましょう。 sub.sub.example.pvt.k12.ma.usをテストしているとします。 pvt.k12.ma.usはパブリックサフィックスです。信じられないかもしれませんが、したがって、公開サフィックスリストを使用した場合、既知のサフィックスを削除することで、それをsub.sub.exampleにすばやく変換できます。次に、残りの部分の最後の部分、つまりドメインを取り除いた後、sub.sub.exampleからsub.subに移動できます。 sub.subはサブドメインです。

3
jlbang

これは、@ jlbangが言及している場合を除いて、ほとんどの場合に機能します

const split=location.Host.split(".");
let subdomain="";
let domain="";
if(split.length==1){//localHost
  domain=split[0];
}else if(split.length==2){//sub.localHost or example.com
  if(split[1].includes("localhost")){//sub.localHost
    domain=split[1];
    subdomain=split[0];
  }else{//example.com
    domain=split.join(".");
  }
}else{//sub2.sub.localHost or sub2.sub.example.com or sub.example.com or example.com.ec sub.example.com.ec or  ... etc
  const last=split[split.length-1];
  const lastLast=split[split.length-2];
  if(last.includes("localhost")){//sub2.sub.localHost
    domain=last;
    subdomain=split.slice(0,split.length-1).join(".");
  }else if(last.length==2 && lastLast.length<=3){//example.com.ec or sub.example.com.ec
    domain=split.slice(split.length-3,split.length).join(".");
    if(split.length>3){//sub.example.com.ec
      subdomain=split.slice(0,split.length-3).join(".");
    }
  }else{//sub2.sub.example.com
    domain=split.slice(split.length-2,split.length).join(".");
    subdomain=split.slice(0,split.length-2).join(".");
  }
}
const newUrl = 'http://example.com/some/path/here/' + subDomain
0