연결이 로컬 호스트인지 javascript로 확인하는 방법은 무엇입니까?


100

페이지로드가 내 로컬 컴퓨터에있는 경우 내 자바 스크립트를 확인하고 싶습니다.

내가 그렇게하고 싶은 이유는 개발할 때 서버 측 (C #) 유효성 검사가 모두 올바르게 작동하는지 확인하기 때문입니다. 그래서 클라이언트 측과 서버 측 오류가 모두 표시되는 것을 좋아합니다.

그래서 테스트하는 동안 jquery에 항상 잘못된 데이터를 통과시키는 플래그가 있습니다. 이렇게하면 클라이언트 측 및 서버 오류를 한 번에 볼 수 있습니다.

그러나 지금은 개발에서 프로덕션으로 이동할 때 수동으로 이동하고 앞뒤로 변경해야합니다.


3
나는 시스템에 기능을 "추가"하기 위해 이러한 답변에서 이러한 방법을 사용하는 사람에게주의 할 것입니다. 특히 해당 기능을 사용하여 시스템에서 보안 정보 나 데이터를 노출하는 데 사용할 수 있다면 더욱 그렇습니다. 그러나이 기술을 사용하여 기능을 "제거"하는 것은 의미가 있습니다. 예를 들어 프로덕션 환경에서 수행하더라도 개발 환경에서 실행 분석 추적을 억제하려는 경우입니다. 브라우저 측 조건부 또는 토글을 통해 노출되는 내용과 보안 취약점이 될 수있는 방법에 대해 신중하게 생각하십시오.
Javid Jamae

답변:


208

location.hostname변수는 당신에게 현재의 호스트를 제공합니다. 어느 환경에 있는지 확인하기에 충분합니다.

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

14
127.0.0.1 등을 사용하는 경우에도 적용되는보다 일반적인 / "범용"솔루션이 없습니까?
jacobq

8
이것은 단지 잘못된 것입니다. 많은 사람들이 호스트 파일을 편집하여 'localhost'라는 단어를 찾을 수 없습니다
vsync

4
나는 동의한다. 이것은 잘못되었습니다. 네트워크 드라이브를 통해 "로컬"파일에 액세스 할 때도 작동하지 않습니다.
ProblemsOfSumit

1
@Sumit 파일 인터페이스를 통해 호스트 이름이 비어 있는지 확인할 수 있습니다
chacham15

1
왜 모든 사람들이 이것을 틀렸다고 말하는지 모르겠습니다. 이 간단한 스니핑은 localhost 및 프로덕션에서 나에게 완벽합니다. 내 소프트웨어는 간단한 코드 한 줄로 광고를 게재 할 날씨를 알고 있습니다. 감사합니다 OP.
Andy

30

예를 들어 file:///C:/Documents and Settings/Administrator/Desktop/"localhost"감지 와 같은 위치에서 브라우저에서 정적 html을 실행하면 작동하지 않습니다. location.hostname빈 문자열을 반환합니다. 그래서

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

나는이 정확한 문제에 부딪 쳤고 내가 해결책을 직접 찾았지만이 대답은 여전히 ​​높을 것입니다.
domsson

6

여전히 모든 것을 잡는 것은 아니지만 약간 개선 될 수 있습니다. 이제 도메인 배열을 만들고 .includes를 사용할 수 있습니다.

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

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

3

이것이 React에서 확인되고 , 서비스 워커를 등록 하고 , localhostIPv6을 포함한 호스트 이름을 확인 하고 127로 시작하는 일치 를 확인하여 localhost에 있는지 확인하는 좋은 방법입니다 .

const isLocalhost = Boolean(
    window.location.hostname === 'localhost' ||
    // [::1] is the IPv6 localhost address.
    window.location.hostname === '[::1]' ||
    // 127.0.0.1/8 is considered localhost for IPv4.
    window.location.hostname.match(
        /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
    )
);

2

이를 수행하는 쉬운 방법은 localhost에 대해 호스트 이름을 확인하거나 하위 문자열 (이 경우 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

다른 스크립트와 동일한 메커니즘을 사용하는 가장 짧은 형식 :

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

2

이것은 또한 로컬 네트워크 IP를로 시작하는 몇 가지 일반적인 경우 포함 10.0.하거나 192.168.또는 Bonjour를 도메인에 끝나는 것처럼를 .local:

export function isLocalNetwork(hostname = window.location.hostname) {
  return (
    (['localhost', '127.0.0.1', '', '::1'].includes(hostname))
    || (hostname.startsWith('192.168.'))
    || (hostname.startsWith('10.0.'))
    || (hostname.endsWith('.local'))
  )
}

1

다음과 같이 C #으로 페이지 뒤의 코드 중 하나에서 감지 할 수 있습니다.

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
}

도움이 되었기를 바랍니다.


3
location.host에는 호스트 이름과 포트가 포함됩니다. 대신 location.hostname을 사용하십시오.
pmont

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

/* offline || development */
if ( LOCAL_DOMAINS.includes(location.hostname) )
{
    BASE_URL_PUBLIC = location.hostname + "/folder/website/"; // your project folder
}

/* online || production */
else
{
    BASE_URL_PUBLIC = location.hostname;
}

0

위의 답변은 대부분 문제를 해결하지만 ...

  • localhost가 반드시 'localhost /'가 아닌 경우 어떻게해야합니까?
  • 개발 중에 FE 검증을 수행하려면 어떻게해야합니까?
  • 개발 중에 다른 동작을 원하는 경우
    ( fe 유효성 검사, 유효성 검사, 유효성 검사 없음 )

한 가지 해결책은 위치 해시를 설정하고 확인하는 것입니다.

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;
}

이 솔루션은 여전히 ​​약간의 수동 작업이 있으며 조작 할 수 있습니다.
A1rPun

자바 스크립트의 승인없이 우리가 원하는 것을 제출할 수 있고 대부분의 프레임 워크에는 요청이 애플리케이션에 도달하기 전에 공격을 완화하는 필터가 있기 때문에 "수동 작업"은 중요하지 않으며 조작도 마찬가지라고 생각합니다. OP가 서버 측 유효성 검사를 건너 뛰도록 허용하는 것은 위험 할 수 있지만 해시에서 키를 사용하는 유틸리티를 보여주기 위해서만 추가되었습니다.
Shanimal

수십 개의 국제화 된 클라이언트 (clinetA.com, clientA.de, clientB.com, clientB.au 등)를 허용 목록에 추가하면 금방 악몽이 될 것이기 때문에 localhost 또는 루프백을 사용하지 않습니다. 이 솔루션을 제공하기로 결정한 이유는 도메인에 대한 관심이없고 패치없이 라이브 사이트에서 확인할 수 있기 때문입니다.
Shanimal

0

정규 표현식은 더 느리지 만 * 짧고 깔끔합니다. 또한 여기에서 아무도 IPv6 로컬 호스트 (:: 1)를 확인하지 않습니다.

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

일반 localhost, .local 도메인 및 파일 (빈 호스트 이름)을 확인합니다.

*) Chrome에서는의 성능이 [].includes(...)최고 (42ms)이고 배열 항목 검사 (119ms)가있는 간단한 루프 (for, while), 다음 [].indexOf(...) > -1(289ms), 마지막으로 regexp (566ms )가 뒤 따릅니다 . 그러나 다른 브라우저가 다르게 최적화되기 때문에 이러한 측정은 다소 상대적입니다. FF ESR (52)에서 includesindexOf유사한 결과가, 정규식은 2 × 6 × 느리고 느린 루프이다.


0

위의 의견을 바탕으로 다음 정규식은 URL이 'localhost'인지, IP 주소 IPv4 또는 IPv6인지 확인하는 데 도움이되었습니다.

window.location.hostname.match(/localhost|[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}|::1|\.local|^$/gi)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.