URL에서 프로토콜, 도메인 및 포트 가져 오기


301

주어진 URL에서 전체 프로토콜, 도메인 및 포트를 추출해야합니다. 예를 들면 다음과 같습니다.

https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer
>>>
https://localhost:8181

9
URL이 현재 위치, 허용 대답 아래의 모습이 아닌 해답을 찾는 독자들을 위해
가이 Schalnat

답변:


150

먼저 현재 주소를 얻으십시오

var url = window.location.href

그런 다음 해당 문자열을 구문 분석하십시오.

var arr = url.split("/");

귀하의 URL은 다음과 같습니다

var result = arr[0] + "//" + arr[2]

도움이 되었기를 바랍니다


8
이것은 location객체를 사용할 수없는 URL 문자열과 함께 작동 합니다 (브라우저 외부의
JS

David Calhoun의 답변 은 내장 파서를 location사용하지만 (예 :) 모든 URL에 사용할 수 있습니다 . 깔끔한 지 확인하십시오.
Stijn de Witt

6
아니면 그냥 하나의 라이너로 바꾸십시오.window.location.href.split('/').slice(0, 3).join('/')
Ryan McGeary

노드에서 어떻게할까요?
DDD

5
window.location.origin
int soumen

576
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');

3
@Randomblue 어때요? 당신은 얻을 것이다 about://. 그러나 궁금한 점이 있습니다. 사용 사례는 about:blank무엇입니까? 브라우저에서에 플러그인 리소스를 주입하는지 확실하지 about:blank않지만 유일하게 유스 케이스 일 수 있습니다.
Shef

3
URL 문자열이 있으면 전혀 작동하지 않습니다. (당신이 할 필요가 즉 에서 location 이 작업을 수행하려면)
닉 T

1
답글이 늦어서 죄송합니다. @NickT. 그렇습니다. David제공 한 멋진 솔루션을 사용하십시오 .
Shef

1
이 답변은 정답으로 선택해야합니다. 깨끗하고 표준 위치 객체를 사용합니다.
Mohit Gangrade 2016 년

14
+ location.host대신 사용할 수 없습니까 ? location.hostnamelocation.port
c24w

180

이 답변 중 어느 것도 질문을 완전히 다루지 않는 것 같습니다.이 페이지는 특히 현재 페이지의 URL이 아닌 임의의 URL을 요구합니다.

방법 1 : URL API 사용 (캐비티 : IE11 지원 안 함)

URL API를 사용할 수 있습니다 (IE11에서는 지원되지 않지만 다른 곳에서는 사용 가능 ).

또한 검색 매개 변수에 쉽게 액세스 할 수 있습니다 . 또 다른 보너스 : DOM에 의존하지 않기 때문에 웹 워커에서 사용할 수 있습니다.

const url = new URL('http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');

방법 2 (구식) : DOM에서 브라우저의 내장 구문 분석기 사용

구형 브라우저에서도 작동하려면 이것을 사용하십시오.

//  Create an anchor element (note: no need to append this element to the document)
const url = document.createElement('a');
//  Set href to any path
url.setAttribute('href', 'http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');

그게 다야!

브라우저의 내장 파서가 이미 작업을 완료했습니다. 이제 필요한 부분 만 잡을 수 있습니다 (위의 두 가지 방법 모두에서 작동 함).

//  Get any piece of the url you're interested in
url.hostname;  //  'example.com'
url.port;      //  12345
url.search;    //  '?startIndex=1&pageSize=10'
url.pathname;  //  '/blog/foo/bar'
url.protocol;  //  'http:'

보너스 : 검색 매개 변수

'? startIndex = 1 & pageSize = 10'자체만으로는 사용할 수 없으므로 검색 URL 매개 변수를 분리 할 수도 있습니다.

위의 방법 1 (URL API)을 사용한 경우 searchParams 게터를 사용하면됩니다.

url.searchParams.get('startIndex');  // '1'

또는 모든 매개 변수를 얻으려면 :

function searchParamsToObj(searchParams) {
  const paramsMap = Array
    .from(url.searchParams)
    .reduce((params, [key, val]) => params.set(key, val), new Map());
  return Object.fromEntries(paramsMap);
}
searchParamsToObj(url.searchParams);
// -> { startIndex: '1', pageSize: '10' }

방법 2 (구식)를 사용한 경우 다음과 같이 사용할 수 있습니다.

// Simple object output (note: does NOT preserve duplicate keys).
var params = url.search.substr(1); // remove '?' prefix
params
    .split('&')
    .reduce((accum, keyval) => {
        const [key, val] = keyval.split('=');
        accum[key] = val;
        return accum;
    }, {});
// -> { startIndex: '1', pageSize: '10' }

link.protocol 저를 유도 할 수있는 "HTTP :"내가 가진 앙커을 검사하는 경우 "google.com":-(var link = document.createElement('a'); link.setAttribute('href', 'google.com'); console.log(link.protocol)
EXE

http아마도 페이지 에서 그렇게하고 있습니까? 지정하지 않으면 현재의 위치에서 '상속'것이다
스테인 드 위트

4
이것은 환상적인 답변이며 더 많은 투표를해야합니다.이 답변은 현재 위치 에만 국한되지 않고 모든 URL 에서 작동 하기 때문에이 답변은 브라우저 자체를 작성하는 대신 브라우저의 내장 파서를 사용하기 때문에 (우리는 할 수 없습니다) 또는 빨리 할 수 ​​있기를 바랍니다!).
Stijn de Witt

이 영리한 트릭에 감사합니다! 나는 한 가지를 추가하고 싶습니다 : 모두가 hosthostname. 전자는 포트 (예 :)를 포함하고 localhost:3000후자는 호스트 이름 (예 :) localhost입니다.
codener

이것은 절대 URL의 경우 잘 작동합니다. 상대 URL 및 크로스 브라우저의 경우 실패합니다. 어떤 제안?
Gururaj

133

어떤 이유로 든 모든 대답은 모두 과잉입니다. 이것이 전부입니다 :

window.location.origin

자세한 내용은 https://developer.mozilla.org/en-US/docs/Web/API/window.location#Properties 에서 확인할 수 있습니다.


19
참고로, 나는 모든 인기있는 브라우저가 그것을 구현 한 때이 미래에 좋을 것이라 확신합니다, 그러나 , 이것은 현재이 아니다 : developer.mozilla.org/en-US/docs/Web/API/... 에서 필자의 연구에 따르면 최신 버전의 Firefox 및 WebKit 브라우저만이 원산지 속성을 지원합니다.
Zac Seth

2
완료 : 위치는 HTML5URLUtils정의되며 WHATWG에 정의되고origin 속성을 포함하는 인터페이스를 구현 합니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

5
MDN 의이 호환성 표 에 따르면 2015 년부터 시작되었습니다. 안타깝게도 URLUtils가 모든 브라우저에서 제대로 구현되지 않았습니다 . 그러나 origin 속성은 2013 년보다 약간 더 잘 지원되는 것 같지만 Safari에서 제대로 구현되지 않았기 때문에 프로덕션에는 적합 하지 않습니다. 죄송합니다 여러분 :(
totallyNotLizards

업데이트 : 여전히 많은 브라우저에서 지원되지 않습니다 (사파리도) :( :(
Ahmad hamza

IE에서도 작동하지 않으며 "정의되지 않음"을 반환합니다.
Siddhartha Chowdhury

53

이미 언급했듯이 아직 완전히 지원되지는 window.location.origin않지만 사용하거나 사용할 새 변수를 만드는 대신 변수를 확인하고 설정하지 않은 경우 선호합니다.

예를 들어;

if (!window.location.origin) {
  window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}

나는 실제로 이것에 대해 몇 달 전에 썼다. window.location.origin에 대한 픽스


1
내가 아는 window.location.origin것은 이번이 처음 입니다. 감사합니다. ^^
EThaizone Jo

33

주최자

var url = window.location.host;

보고 localhost:2679

호스트 이름

var url = window.location.hostname;

보고 localhost


감사합니다!!! localhost가 localhost/대신 으로 표시되는 이유를 알 수 없었습니다 localhost:3000.
Tyler Youngblood

23

window.location.origin 동일하게 충분합니다.


1
그것은 내 문제를 쉽게 해결했습니다. @intsoumen 주셔서 감사합니다
Turker Tunali

14

프로토콜 속성은 콜론 (:)을 포함하여 현재 URL의 프로토콜을 설정하거나 반환합니다.

즉, HTTP / HTTPS 부분 만 가져 오려면 다음과 같이 할 수 있습니다.

var protocol = window.location.protocol.replace(/:/g,'')

도메인의 경우 다음을 사용할 수 있습니다.

var domain = window.location.hostname;

포트의 경우 다음을 사용할 수 있습니다.

var port = window.location.port;

포트가 URL에 표시되지 않으면 빈 문자열이됩니다. 예를 들면 다음과 같습니다.

포트를 사용하지 않을 때 80/443을 표시해야하는 경우

var port = window.location.port || (protocol === 'https' ? '443' : '80');

9

사용하지 않는 이유 :

let full = window.location.origin

3
기존 답변이 포함 된 이전 질문에 대한 답변을 추가 할 때 답변에 제공되는 새로운 정보를 설명하고 시간이 지남에 따라 답변에 영향을 미치는지 확인하는 것이 유용합니다.
Jason Aller

8

실제로 window.location.origin 은 표준에 따라 브라우저에서 잘 작동하지만 추측합니다. IE는 표준을 따르지 않습니다.

따라서 IE, FireFox 및 Chrome에서 다음과 같이 작동했습니다.

var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');

그러나 충돌을 일으킬 수있는 향후 개선 가능성을 위해 "location"개체 앞에 "window"참조를 지정했습니다.

var full = window.location.protocol+'//'+window.location.hostname+(window.location.port ? ':'+window.location.port: '');

6

사용중인 솔루션은 다음과 같습니다.

const result = `${ window.location.protocol }//${ window.location.host }`;

편집하다:

브라우저 간 호환성을 추가하려면 다음을 사용하십시오.

const result = `${ window.location.protocol }//${ window.location.hostname + (window.location.port ? ':' + window.location.port: '') }`;

1
Upvoted는하지만, window.location.host최고의 크로스 브라우저를하지 않을 수 있습니다
nathanfranke

1
감사합니다. 원래 답변에 브라우저 간 호환성을 추가했습니다.
JulienRioux

3
var http = location.protocol;
var slashes = http.concat("//");
var host = slashes.concat(window.location.hostname);

3
var getBasePath = function(url) {
    var r = ('' + url).match(/^(https?:)?\/\/[^/]+/i);
    return r ? r[0] : '';
};

2
답을 설명해보십시오. OP가 코드의 다른 부분의 중요성을 이해할 수 있다고 가정하지 마십시오.
ADyson

3

정규식 (Regex)을 사용해보십시오. 이는 유효성을 검사 / 추출하거나 자바 스크립트에서 간단한 파싱을 수행 할 때 매우 유용합니다.

정규식은 다음과 같습니다.

/([a-zA-Z]+):\/\/([\-\w\.]+)(?:\:(\d{0,5}))?/

데모:

function breakURL(url){

     matches = /([a-zA-Z]+):\/\/([\-\w\.]+)(?:\:(\d{0,5}))?/.exec(url);

     foo = new Array();

     if(matches){
          for( i = 1; i < matches.length ; i++){ foo.push(matches[i]); }
     }

     return foo
}

url = "https://www.google.co.uk:55699/search?q=http%3A%2F%2F&oq=http%3A%2F%2F&aqs=chrome..69i57j69i60l3j69i65l2.2342j0j4&sourceid=chrome&ie=UTF-8"


breakURL(url);       // [https, www.google.co.uk, 55699] 
breakURL();          // []
breakURL("asf");     // []
breakURL("asd://");  // []
breakURL("asd://a"); // [asd, a, undefined]

이제 유효성 검사도 수행 할 수 있습니다.


편지 "유효한 RFC 3986 URL 체계가 구성되어야"하고 문자, 숫자의 조합 다음에 플러스 ( "+"), 마침표 ( ".") 또는 하이픈 ( "-"). "- 유래. com / a / 9142331 / 188833 (여기에 urn : ietf : rfc : 3897 (URI) / urn : ietf : rfc : 3897 (IRI) 정규식이 있습니다. 파이썬에서 URI / IRI의 일부 : github.com/dgerber /rfc3987/blob/master/rfc3987.py#L147 )
Wes Turner

2

모든 브라우저에서 작동하는 간단한 답변 :

let origin;

if (!window.location.origin) {
  origin = window.location.protocol + "//" + window.location.hostname + 
     (window.location.port ? ':' + window.location.port: '');
}

origin = window.location.origin;

1

구성 가능한 매개 변수가있는 ES6 스타일.

/**
 * Get the current URL from `window` context object.
 * Will return the fully qualified URL if neccessary:
 *   getCurrentBaseURL(true, false) // `http://localhost/` - `https://localhost:3000/`
 *   getCurrentBaseURL(true, true) // `http://www.example.com` - `https://www.example.com:8080`
 *   getCurrentBaseURL(false, true) // `www.example.com` - `localhost:3000`
 *
 * @param {boolean} [includeProtocol=true]
 * @param {boolean} [removeTrailingSlash=false]
 * @returns {string} The current base URL.
 */
export const getCurrentBaseURL = (includeProtocol = true, removeTrailingSlash = false) => {
  if (!window || !window.location || !window.location.hostname || !window.location.protocol) {
    console.error(
      `The getCurrentBaseURL function must be called from a context in which window object exists. Yet, window is ${window}`,
      [window, window.location, window.location.hostname, window.location.protocol],
    )
    throw new TypeError('Whole or part of window is not defined.')
  }

  const URL = `${includeProtocol ? `${window.location.protocol}//` : ''}${window.location.hostname}${
    window.location.port ? `:${window.location.port}` : ''
  }${removeTrailingSlash ? '' : '/'}`

  // console.log(`The URL is ${URL}`)

  return URL
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.