web-dev-qa-db-ja.com

接続がローカルホストであるかどうかをJavaScriptで確認する方法は?

ページの読み込みがローカルマシン上にある場合、javascriptをチェックしたい。

私がそれをしたいのは、開発時にサーバー側(C#)の検証が両方とも正しく機能することを確認したいからです。そのため、クライアント側とサーバー側の両方のエラーが表示されるのを見るのが好きです。

したがって、テスト中に、jquery validateのものに、常に無効なデータを通過させるフラグがあります。このようにして、クライアント側とサーバーのエラーを一度に確認できます。

ただし、現在は、開発から実稼働に移行する際に手動で行ったり来たりする必要があります。

75
chobo2

location.hostname変数は、現在のホストを提供します。どの環境にいるかを判断するには、これで十分です。

if (location.hostname === "localhost" || location.hostname === "127.0.0.1")
    alert("It's a local server!");
167
Unicron

ブラウザで静的htmlを起動する場合、たとえばfile:///C:/Documents and Settings/Administrator/Desktop/などの場所から「localhost」を検出しても機能しません。 location.hostnameは空の文字列を返します。そう

if (location.hostname === "localhost" || location.hostname === "127.0.0.1" || location.hostname === "")
    alert("It's a local server!");
21

まだすべてではありませんが、少し改善されるかもしれません。ドメインの配列を作成し、 。includes を使用できるようになりました

const LOCAL_DOMAINS = ["localhost", "127.0.0.1", ...];

if (LOCAL_DOMAINS.includes(window.location.hostname))
  alert("It's a local server!");
3

これを行う簡単な方法は、ホスト名をローカルホストと照合するか、カスタム文字列とサブストリングを照合することです。この場合、 http://testsite.local などの「.local」URL

var myUrlPattern = '.local';
if (window.location.hostname === "localhost" || location.hostname === "127.0.0.1" || window.location.hostname.indexOf(myUrlPattern) >= 0) {
    alert("It's a local server!");
}
2
Summit

次のように、c#を使用してページの背後にあるコードの1つを検出できます。

if ((Request.Url.Host.ToLower() == "localhost"))
{
    // ..., maybe set an asp:Literal value that's in the js
}

または、クライアントスクリプトから実行する場合は、window.location.Hostの値を確認できます。

if (window.location.Host == "localhost")
{
    // Do whatever
}

お役に立てれば。

1
Samuel Meacham

他のスクリプトと同じメカニズムを使用した最短形式:

if ( ["localhost", "127.0.0.1", ""].includes(window.location.hostname) ) {
     console.log("It's local Host !");
}
1
TarmoPikaro

上記の答えはほとんど問題を解決しますが...

  • Localhostが必ずしも「localhost /」ではない場合はどうなりますか?
  • 開発中にFE検証を行いたい場合はどうしますか?
  • 開発中に異なる動作が必要な場合
    fe検証、be検証、検証なし

1つの解決策は、場所のハッシュを設定して確認することです。

http://myname.foo.com/form.html#devValidation

スイッチで無制限のオプションを追加できます

switch(location.hash) {}
    case '#devValidation':
        // log the results and post the form
        break;
    case '#beValidation':
        // skip front end validation entirely
        break;
    case '#noValidation':
        // skip all validation $('[name=validationType']).val('novalidation');
        break;
    case '#feValidation':
    default:
        // do fe validation
        break;
}
0
Shanimal

正規表現は遅くなりますが*、短く簡潔です。また、ここでだれもIPv6 localhost(:: 1)をチェックしません

_/localhost|127\.0\.0\.1|::1|\.local|^$/i.test(location.hostname)
_

一般的なlocalhost、.localドメイン、およびファイル:(空のホスト名)をチェックします。

*)Chromeでは、[].includes(...)のパフォーマンスが最高(42ミリ秒)で、その後に配列項目チェック(119ミリ秒)を含む単純なループ(for、while)、_[].indexOf(...) > -1(289 ms)、最後に正規表現(566 ms)。ただし、ブラウザごとに最適化方法が異なるため、これらの測定値はある程度相対的です。 FF 52 ESRでは、includesindexOfの結果は似ていますが、regexpは2倍遅く、ループは6倍遅くなります。

0
mikiqex