รับโปรโตคอลโดเมนและพอร์ตจาก URL


301

ฉันต้องการแยกโพรโทคอลโดเมนและพอร์ตทั้งหมดจาก URL ที่กำหนด ตัวอย่างเช่น:

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

9
สำหรับผู้อ่านที่กำลังมองหาคำตอบที่ URL ไม่ใช่ตำแหน่งปัจจุบันให้ดูคำตอบที่ได้รับการยอมรับด้านล่าง
Guy Schalnat

คำตอบ:


150

ก่อนรับที่อยู่ปัจจุบัน

var url = window.location.href

จากนั้นก็แยกสตริงที่

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

URL ของคุณคือ:

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

หวังว่านี่จะช่วยได้


8
ใช้งานได้กับสตริง URL ที่locationวัตถุไม่พร้อมใช้งาน (js นอกเบราว์เซอร์!)
Thamme Gowda

คำตอบของ David Calhoun ใช้ parser ในตัว (เหมือน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นี่เพื่อทำงาน)
Nick T

1
ขออภัยสำหรับการตอบกลับล่าช้า @NickT ใช่มันไม่ได้ทำอย่างนั้น โปรดใช้วิธีการแก้ปัญหาที่ดีให้โดยดาวิดว่า
Shef

1
ควรเลือกคำตอบนี้เป็นคำตอบที่ถูกต้อง มันสะอาดและใช้วัตถุตำแหน่งมาตรฐาน
Mohit Gangrade

14
คุณใช้location.hostแทนlocation.hostname+ location.portไม่ได้ใช่ไหม
c24w

180

ดูเหมือนว่าจะไม่มีคำตอบใดที่จะตอบคำถามนี้อย่างสมบูรณ์ซึ่งเรียกร้องให้มี url ที่กำหนดเองไม่ใช่ url ของหน้าปัจจุบันโดยเฉพาะ

วิธีที่ 1: ใช้ URL API (caveat: ไม่มีการสนับสนุน IE11)

คุณสามารถใช้URL API (ไม่รองรับโดย IE11 แต่ใช้ได้ทุกที่ )

นอกจากนี้ยังช่วยให้เข้าถึงparams การค้นหาได้ง่าย โบนัสอื่น: สามารถใช้ใน Web Worker เนื่องจากไม่ได้ขึ้นอยู่กับ 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');

แค่นั้นแหละ!

parser ในตัวของเบราว์เซอร์ทำงานแล้ว ตอนนี้คุณสามารถคว้าชิ้นส่วนที่คุณต้องการได้ (โปรดทราบว่าวิธีนี้ใช้ได้กับทั้งสองวิธีข้างต้น):

//  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' ไม่สามารถใช้งานได้ด้วยตัวเอง

หากคุณใช้วิธีที่ 1 (URL API) ด้านบนคุณเพียงใช้ searchParams getters:

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:" ถ้าฉันตรวจสอบ anker ด้วย "google.com" :-(var link = document.createElement('a'); link.setAttribute('href', 'google.com'); console.log(link.protocol)
2559

คุณกำลังทำสิ่งนั้นอยู่บนhttpหน้ากระดาษหรือเปล่า? หากไม่ได้ระบุจะเป็นการ 'รับช่วง' จากตำแหน่งปัจจุบัน
Stijn de Witt

4
นี่เป็นคำตอบที่ยอดเยี่ยมและควรได้รับคะแนนมากขึ้นเพราะคำตอบนี้ไม่ได้ จำกัด อยู่แค่ตำแหน่งปัจจุบันแต่ใช้ได้กับURL ใด ๆและเพราะคำตอบนี้ใช้ตัวแยกวิเคราะห์ในตัวของเบราว์เซอร์แทนที่จะสร้างตัวเราเอง หวังว่าจะทำได้ดีหรือเร็ว!)
Stijn de Witt

ขอบคุณสำหรับเคล็ดลับอันชาญฉลาดนี้! ฉันต้องการที่จะเพิ่มสิ่งหนึ่ง: มีทั้งสองและhost hostnameอดีตรวมถึงพอร์ต (เช่นlocalhost:3000) ในขณะที่หลังเป็นเพียงชื่อโฮสต์ (เช่นlocalhost )
codener

สิ่งนี้ทำงานได้ดีในกรณีที่เป็น URL ที่แน่นอน มันล้มเหลวในกรณีของ URL ที่สัมพันธ์และข้ามเบราว์เซอร์ ข้อเสนอแนะใด ๆ
Gururaj

133

ด้วยเหตุผลบางอย่างคำตอบทั้งหมดเป็น overkills ทั้งหมด นี่คือทั้งหมดที่ใช้:

window.location.origin

รายละเอียดเพิ่มเติมสามารถดูได้ที่นี่: https://developer.mozilla.org/en-US/docs/Web/API/window.location#Properties


19
FYI ฉันแน่ใจว่านี่จะเป็นสิ่งที่ดีในอนาคตเมื่อเบราว์เซอร์ยอดนิยมทั้งหมดได้นำไปใช้จริงอย่างไรก็ตามนี่ไม่ใช่กรณีปัจจุบัน: developer.mozilla.org/en-US/docs/Web/API/ ...... ที่ เวลาที่เขียนเฉพาะเบราว์เซอร์ Firefox และ WebKit รุ่นล่าสุดเท่านั้นที่สนับสนุนคุณสมบัติต้นกำเนิดตามการวิจัยของฉัน
Zac Seth

2
เพียงเพื่อทำให้สมบูรณ์: กำหนดตำแหน่งใน HTML5และใช้URLUtilsอินเทอร์เฟซที่กำหนดไว้ใน WHATWGและรวมถึงoriginแอตทริบิวต์
Ciro Santilli 郝海东冠状病六四事件法轮功

5
สวัสดีจากปี 2015 ขออภัย URLUtils ยังไม่ได้ใช้งานอย่างถูกต้องในทุกเบราว์เซอร์ตามตารางความเข้ากันได้นี้ MDN อย่างไรก็ตามดูเหมือนว่าคุณสมบัติต้นกำเนิดได้รับการสนับสนุนที่ดีกว่าเล็กน้อยในปี 2013 แต่ก็ยังไม่เหมาะสำหรับการผลิตเนื่องจากไม่ได้ใช้งานอย่างถูกต้องใน Safari ขออภัยพวก :(
เต็มเปา NotLizards

อัปเดต: ยังไม่รองรับเบราว์เซอร์จำนวนมาก (เช่นกัน) :( :(
Ahmad hamza

มันไม่ทำงานใน IE เช่นกันมันคืนค่า "undefined"
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: '');

แต่สำหรับการปรับปรุงในอนาคตที่เป็นไปได้ซึ่งอาจทำให้เกิดข้อขัดแย้งฉันได้ระบุการอ้างอิง "หน้าต่าง" ก่อนวัตถุ "ตำแหน่ง"

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
โหวตขึ้น แต่window.location.hostอาจไม่ใช่เบราว์เซอร์ที่ดีที่สุด
nathanfranke

1
ขอบคุณฉันได้เพิ่มความเข้ากันได้ข้ามเบราว์เซอร์ในคำตอบเดิมของฉัน
JulienRioux


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

2
พิจารณาอธิบายคำตอบของคุณ อย่าถือว่า OP สามารถเข้าใจความสำคัญของส่วนต่างๆของรหัสของคุณ
ADyson

3

ลองใช้นิพจน์ทั่วไป (Regex) ซึ่งจะมีประโยชน์มากเมื่อคุณต้องการตรวจสอบ / แยกข้อมูลหรือแม้แต่การแยกวิเคราะห์แบบง่ายๆใน javascript

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]

ตอนนี้คุณสามารถตรวจสอบได้เช่นกัน


"รูปแบบ URL RFC 3986 ที่ถูกต้องจะต้องประกอบด้วย" ตัวอักษรและตามด้วยตัวอักษรตัวเลขบวก ("+"), จุด (".") หรือยัติภังค์ ("-") "- สแต็คโอเวอร์โฟลว์ com / a / 9142331/188833 (นี่คือโกศ: ietf: rfc: 3897 (URI) / urn: ietf: rfc: 3897 (IRI) regex สำหรับโครงร่าง: ส่วนหนึ่งของ URI / IRI ใน Python: 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.