URL'den protokol, alan adı ve bağlantı noktası alın


301

Belirli bir URL'den tam protokol, etki alanı ve bağlantı noktasını ayıklamak gerekiyor. Örneğin:

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

9
URL'nin geçerli konum olmadığı bir yanıt arayan okuyucular için kabul edilen cevabın altına bakın
Guy Schalnat

Yanıtlar:


150

önce mevcut adresi al

var url = window.location.href

Sonra bu dizeyi ayrıştırın

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

url’niz:

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

Bu yardımcı olur umarım


8
Bu, locationnesnenin kullanılamadığı URL dizesiyle çalışır (tarayıcı dışında js!)
Thamme Gowda

David Calhoun'un cevabı yerleşik ayrıştırıcıyı kullanır (gibi location) ancak herhangi bir url için kullanılabilir . Düzenli göz atın.
Stijn de Witt

6
Veya sadece bir astar haline getirin:window.location.href.split('/').slice(0, 3).join('/')
Ryan McGeary

ve bunu düğümde nasıl yapacaksınız?
DDD

5
window.location.origin
int soumen

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

3
@Randomblue Ne olmuş? Sen alacaksın about://. Ancak merak ediyorum, kullanım durumu ne olacak about:blank? Herhangi bir tarayıcının eklenti kaynaklarını enjekte edip etmediğinden emin değilim about:blank, ancak bu tek kullanım örneği olabilir gibi görünüyor.
Shef

3
Bir URL dizeniz varsa bu işe yaramıyor, değil mi? (yani bunun çalışması location için orada olmanız gerekir )
Nick T

1
Geç cevap verdiğim için üzgünüm, @NickT. Evet, öyle değil. Lütfen, bunun için David'in sağladığı güzel çözümü kullanın .
Shef

1
Bu cevap doğru cevap olarak seçilmelidir. Temiz ve standart konum nesnesini kullanıyor.
Mohit Gangrade

14
Eğer kullanılamaz location.hostyerine location.hostname+ location.port?
c24w

180

Bu yanıtların hiçbiri, özellikle geçerli sayfanın URL'sini değil, rastgele bir URL gerektiren soruyu tamamen ele almıyor gibi görünüyor.

Yöntem 1: URL API'sini kullanma (uyarı: IE11 desteği yok)

URL API'sını kullanabilirsiniz (IE11 tarafından desteklenmez, ancak başka her yerde kullanılabilir ).

Bu aynı zamanda arama parametrelerine erişmeyi de kolaylaştırır . Başka bir bonus: DOM'ye bağlı olmadığı için bir Web Çalışanı'nda kullanılabilir.

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

Yöntem 2 (eski yol): DOM'da tarayıcının yerleşik ayrıştırıcısını kullanma

Eski tarayıcılarda da çalışmak için buna ihtiyacınız varsa bunu kullanın.

//  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');

Bu kadar!

Tarayıcının yerleşik ayrıştırıcısı işini çoktan yaptı. Şimdi ihtiyacınız olan parçaları alabilirsiniz (bunun yukarıdaki her iki yöntemde de işe yaradığını unutmayın):

//  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:'

Bonus: Arama parametreleri

'? StartIndex = 1 & pageSize = 10' kendi başına çok kullanışlı olmadığından, büyük olasılıkla arama URL parametrelerini de ayırmak isteyeceksinizdir.

Yukarıdaki Yöntem 1'i (URL API) kullandıysanız, sadece searchParams alıcılarını kullanın:

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

Veya tüm parametreleri almak için:

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

Yöntem 2'yi (eski yol) kullandıysanız, şöyle bir şey kullanabilirsiniz:

// 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 beni alır Bir "http:" Ben bir Anker incelemek eğer "google.com" :-(var link = document.createElement('a'); link.setAttribute('href', 'google.com'); console.log(link.protocol)
eXe

Bunu httpbelki bir sayfada mı yapıyorsun ? Belirtilmezse geçerli konumdan 'miras alacaktır'
Stijn de Witt

4
Bu harika bir cevaptır ve daha fazla oy almalıdır, çünkü bu cevap sadece mevcut konumla sınırlı değildir , herhangi bir url için çalışır ve bu cevap, kendimiz oluşturmak yerine tarayıcının yerleşik ayrıştırıcısını kullandığından (ki biz yapamayız) iyi ya da hızlı yapmayı umuyoruz!).
Stijn de Witt

Bu akıllı numara için teşekkürler! Ben bir şey eklemek istiyorum: Orada hem hostve hostname. Birincisi bağlantı noktasını (ör. localhost:3000) İçerirken, ikincisi yalnızca ana bilgisayarın adıdır (ör. localhost).
Coder

Mutlak URL durumunda bu işe yarar. Göreli URL ve çapraz tarayıcı durumunda başarısız olur. Herhangi bir öneri?
Gururaj

133

Nedense bütün cevaplar aşırıya kaçıyor. Tüm gereken bu:

window.location.origin

Daha fazla ayrıntıyı burada bulabilirsiniz: https://developer.mozilla.org/en-US/docs/Web/API/window.location#Properties


19
Bilginize, eminim gelecekte tüm popüler tarayıcılar uyguladığında bu harika olacak, ancak şu anda durum böyle değil: developer.mozilla.org/en-US/docs/Web/API/… At Araştırmamıza göre Firefox ve WebKit tarayıcılarının yalnızca son sürümlerini yazma zamanı orijinal özelliğini destekliyor.
Zac Seth

2
Sadece tamamlamak için: HTML5 üzerinde konum tanımlanır ve WHATWG'de tanımlanan ve özniteliği içeren URLUtilsarabirimi uygular . origin
Ciro Santilli 法轮功

5
2015'ten merhaba .. MDN'deki bu uyumluluk tablosuna göre ne yazık ki URLUtils hala tüm tarayıcılarda düzgün bir şekilde uygulanmıyor . Ancak, origin özelliği 2013'ten biraz daha iyi destekleniyor gibi görünüyor, Safari'de düzgün bir şekilde uygulanmadığı için hala üretime uygun değil. Üzgünüm çocuklar :(
tamamenNotLizards

Güncelleme: Hala birçok tarayıcı için desteklenmiyor (safari de) :( :(
Ahmad hamza

IE'de de çalışmaz, "tanımsız" değerini döndürür.
Siddhartha Chowdhury

53

Daha önce de belirtildiği gibi henüz tam olarak desteklenmemiştir, window.location.originancak onu kullanmak veya kullanmak için yeni bir değişken oluşturmak yerine, onu kontrol etmeyi ve ayarlamak için ayarlanmamışsa kontrol etmeyi tercih ederim.

Örneğin;

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

Aslında bu konuda birkaç ay önce yazdım Bir pencere için düzeltme.location.origin


1
Bu var olduğunu ilk kez biliyorum window.location.origin. Teşekkür ederim. ^^
EThaizone Jo

33

evsahibi

var url = window.location.host;

İadeler localhost:2679

hostname

var url = window.location.hostname;

İadeler localhost


Teşekkür ederim!!! Localhost'un neden localhost/yerine gösterildiğini anlayamadım localhost:3000.
Tyler Youngblood

23

window.location.origin aynı şeyi elde etmek için yeterli olacaktır.


1
Bu benim sorunumu kolayca çözdü. Thank you @intsoumen
Turker Tunali

14

Protokol özelliği, iki nokta üst üste (:) dahil olmak üzere geçerli URL'nin protokolünü ayarlar veya döndürür.

Bu, yalnızca HTTP / HTTPS bölümünü almak istiyorsanız, bunun gibi bir şey yapabileceğiniz anlamına gelir:

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

Alan adı için şunları kullanabilirsiniz:

var domain = window.location.hostname;

Bağlantı noktası için şunları kullanabilirsiniz:

var port = window.location.port;

URL'de görünmüyorsa bağlantı noktasının boş bir dize olacağını unutmayın. Örneğin:

Liman kullanımınız olmadığında 80/443 göstermeniz gerekiyorsa

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

9

Neden kullanmıyorsunuz:

let full = window.location.origin

3
Mevcut cevapları olan daha eski bir soruya cevap eklerken, cevabınızın hangi yeni bilgiyi getirdiğini açıklamak ve zamanın geçişin cevabı etkileyip etkilemediğini kabul etmek yararlı olacaktır.
Jason Aller

8

Gerçekten de, window.location.origin , tarayıcılara standartlara uygun olarak iyi çalışır, ancak ne olduğunu tahmin edin. IE standartları takip etmiyor.

Bu nedenle, IE, FireFox ve Chrome'da benim için çalışan bu oldu:

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

ancak çakışmalara neden olabilecek gelecekteki olası geliştirmeler için, "location" nesnesinden önce "window" referansını belirledim.

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

6

İşte kullandığım çözüm:

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

DÜZENLE:

Tarayıcılar arası uyumluluk eklemek için aşağıdakileri kullanın:

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

1
Oy verildi, ancak window.location.hosten iyi çapraz tarayıcı
olmayabilir

1
Teşekkürler, orijinal yanıtıma tarayıcılar arası uyumluluk ekledim.
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
cevabınızı açıklamayı düşünün. OP'nin kodunuzun farklı bölümlerinin önemini anlayabileceğini düşünmeyin.
ADyson

3

Bir şeyleri doğrulamak / ayıklamak veya hatta basit bir ayrıştırma yapmak istediğinizde oldukça yararlı olacak normal bir ifade (Regex) kullanmayı deneyin.

Normal ifade:

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

gösteri:

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]

Artık doğrulama da yapabilirsiniz.


"Geçerli bir RFC 3986 URL şeması" bir harf ve ardından gelen harf, rakam, artı ("+"), nokta (".") Veya kısa çizgi ("-") birleşiminden oluşmalıdır. - yığın akışı . com / a / 9142331/188833 (İşte bir urn: ietf: rfc: 3897 (URI) / urn: ietf: rfc: 3897 (IRI) düzen için normal ifade: Python'daki bir URI / IRI parçası: github.com/dgerber /rfc3987/blob/master/rfc3987.py#L147 )
Wes Turner

2

Tüm tarayıcılarda çalışan basit yanıt:

let origin;

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

origin = window.location.origin;

1

Yapılandırılabilir parametrelerle ES6 stili.

/**
 * 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
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.