Nhận giao thức, tên miền và cổng từ URL


301

Tôi cần trích xuất toàn bộ giao thức, tên miền và cổng từ một URL nhất định. Ví dụ:

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

9
Đối với những độc giả đang tìm kiếm câu trả lời trong đó URL không phải là vị trí hiện tại, hãy xem bên dưới câu trả lời được chấp nhận
Guy Schalnat

Câu trả lời:


150

đầu tiên lấy địa chỉ hiện tại

var url = window.location.href

Sau đó, chỉ cần phân tích chuỗi đó

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

url của bạn là:

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

Hi vọng điêu nay co ich


8
Điều này hoạt động với chuỗi URL locationkhông có đối tượng (js bên ngoài trình duyệt!)
Thamme Gowda

Câu trả lời của David Calhoun sử dụng trình phân tích cú pháp tích hợp (như location) nhưng có thể được sử dụng cho bất kỳ url nào . Kiểm tra xem nó có gọn gàng không.
Stijn de Witt

6
Hoặc chỉ cần biến nó thành một lớp lót:window.location.href.split('/').slice(0, 3).join('/')
Ryan McGeary

và làm thế nào bạn làm điều này trên nút?
DDD

5
window.location.origin
int soumen 30/11/18

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

3
@Randomblue Còn nó thì sao? Bạn sẽ nhận được about://. Tuy nhiên, tôi tò mò muốn biết, trường hợp sử dụng để làm about:blankgì? Tôi không chắc chắn nếu có bất kỳ trình duyệt nào bơm tài nguyên plugin vào about:blank, nhưng có vẻ như đó có thể là trường hợp sử dụng duy nhất.
Shef

3
Điều này hoàn toàn không hoạt động nếu bạn có một chuỗi URL, phải không? (tức là bạn cần phải có mặt location để làm việc này)
Nick T

1
Xin lỗi vì đã trả lời trễ, @NickT. Vâng, nó không làm điều đó. Xin vui lòng, sử dụng giải pháp tốt đẹp được cung cấp bởi David cho điều đó.
Shef 7/10/2015

1
Câu trả lời này nên được chọn là câu trả lời đúng. Nó sạch sẽ và sử dụng đối tượng vị trí tiêu chuẩn.
Mohit Gangrade

14
Bạn không thể sử dụng location.hostthay vì location.hostname+ location.port?
c24w

180

Không có câu trả lời nào trong số này dường như giải quyết hoàn toàn câu hỏi, trong đó yêu cầu một url tùy ý, không cụ thể là url của trang hiện tại.

Phương pháp 1: Sử dụng API URL (báo trước: không hỗ trợ IE11)

Bạn có thể sử dụng API URL (không được IE11 hỗ trợ, nhưng có sẵn ở mọi nơi khác ).

Điều này cũng làm cho nó dễ dàng truy cập các thông số tìm kiếm . Một phần thưởng khác: nó có thể được sử dụng trong Công nhân web vì nó không phụ thuộc vào DOM.

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

Phương pháp 2 (cách cũ): Sử dụng trình phân tích cú pháp tích hợp của trình duyệt trong DOM

Sử dụng cái này nếu bạn cần cái này để làm việc trên các trình duyệt cũ hơ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');

Đó là nó!

Trình phân tích cú pháp tích hợp của trình duyệt đã hoàn thành công việc của nó. Bây giờ bạn chỉ có thể lấy các phần bạn cần (lưu ý rằng điều này hoạt động cho cả hai phương pháp trê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:'

Phần thưởng: Tìm kiếm thông số

Rất có thể bạn cũng muốn phá vỡ các thông số url tìm kiếm, vì '? Start Index = 1 & pageSize = 10' không thể sử dụng quá nhiều.

Nếu bạn đã sử dụng Phương pháp 1 (API URL) ở trên, bạn chỉ cần sử dụng getters searchParams:

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

Hoặc để có được tất cả các tham số:

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

Nếu bạn đã sử dụng Phương pháp 2 (cách cũ), bạn có thể sử dụng một cái gì đó như thế này:

// 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.protatio sẽ cho tôi một "http:" nếu tôi kiểm tra một anker bằng "google.com" :-(var link = document.createElement('a'); link.setAttribute('href', 'google.com'); console.log(link.protocol)
eXe

Bạn đang làm điều đó trên một httptrang có lẽ? Nếu không được chỉ định, nó sẽ 'kế thừa' từ vị trí hiện tại
Stijn de Witt

4
Đây là một câu trả lời tuyệt vời và sẽ nhận được nhiều phiếu bầu hơn, bởi vì câu trả lời này không chỉ giới hạn ở vị trí hiện tại mà còn hoạt động với bất kỳ url nào và vì câu trả lời này sử dụng trình phân tích cú pháp tích hợp của trình duyệt thay vì tự xây dựng (mà chúng ta không thể hy vọng sẽ làm tốt hoặc nhanh!).
Stijn de Witt

Cảm ơn bạn cho thủ thuật thông minh này! Tôi muốn thêm một điều: Có cả hai hosthostname. Cái trước bao gồm cổng (ví dụ localhost:3000), trong khi cái sau chỉ là tên của máy chủ (ví dụ localhost).
viết mã

Điều này hoạt động tốt trong trường hợp URL tuyệt đối. Nó không thành công trong trường hợp URL tương đối và trình duyệt chéo. Bất kỳ đề xuất?
Gururaj

133

Vì một số lý do, tất cả các câu trả lời đều là quá mức cần thiết. Đây là tất cả những gì nó cần:

window.location.origin

Thông tin chi tiết có thể được tìm thấy ở đây: https://developer.mozilla.org/en-US/docs/Web/API/window.location#Properies


19
FYI, tôi chắc chắn rằng điều này sẽ rất tuyệt trong tương lai khi tất cả các trình duyệt phổ biến đã triển khai nó, tuy nhiên , hiện tại không phải vậy: developer.mozilla.org/en-US/docs/Web/API/ . thời gian chỉ viết các phiên bản gần đây của trình duyệt Firefox và WebKit hỗ trợ thuộc tính gốc theo nghiên cứu của tôi.
Zac Seth

2
Chỉ cần hoàn thành: vị trí được xác định trên HTML5 và nó thực hiện URLUtilsgiao diện được xác định trên WHATWG và bao gồm originthuộc tính.
Ciro Santilli 郝海东 冠状 病 事件

5
Xin chào từ năm 2015 .. thật không may, URLUtils vẫn chưa được triển khai đúng cách trên tất cả các trình duyệt, theo bảng tương thích này trên MDN. Tuy nhiên, có vẻ như thuộc tính gốc được hỗ trợ tốt hơn một chút so với năm 2013, nó vẫn không phù hợp để sản xuất vì nó không được triển khai đúng cách trong Safari. Xin lỗi các bạn :(
hoàn toàn không phải là

Cập nhật: Vẫn không được hỗ trợ cho nhiều trình duyệt (safari) :( :(
Ahmad hamza

Nó cũng không hoạt động trong IE, nó trả về "không xác định".
Siddhartha Chowdhury

53

Như đã được đề cập, có một điều chưa được hỗ trợ đầy đủ window.location.originnhưng thay vì sử dụng nó hoặc tạo một biến mới để sử dụng, tôi thích kiểm tra nó và nếu nó không được đặt để đặt nó.

Ví dụ;

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

Tôi thực sự đã viết về điều này một vài tháng trước Một bản sửa lỗi cho window.location.origin


1
Đây là lần đầu tiên tôi biết window.location.originlà tồn tại. Cảm ơn bạn. ^^
EThaizone Jo

33

tổ chức

var url = window.location.host;

trả lại localhost:2679

tên máy chủ

var url = window.location.hostname;

trả lại localhost


Cảm ơn bạn!!! Tôi không thể hiểu tại sao localhost lại hiển thị localhost/thay vì localhost:3000.
Tyler Youngblood

23

window.location.origin sẽ là đủ để có được cùng.


1
Điều đó giải quyết vấn đề của tôi một cách dễ dàng. Cảm ơn bạn @ gợi ý
Turker Tunali ngày

14

Thuộc tính giao thức đặt hoặc trả về giao thức của URL hiện tại, bao gồm cả dấu hai chấm (:).

Điều này có nghĩa là nếu bạn chỉ muốn nhận phần HTTP / HTTPS, bạn có thể làm một cái gì đó như thế này:

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

Đối với tên miền bạn có thể sử dụng:

var domain = window.location.hostname;

Đối với cổng bạn có thể sử dụng:

var port = window.location.port;

Hãy nhớ rằng cổng sẽ là một chuỗi trống nếu nó không hiển thị trong URL. Ví dụ:

Nếu bạn cần hiển thị 80/443 khi bạn không sử dụng cổng

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

9

Tại sao không sử dụng:

let full = window.location.origin

3
Khi thêm câu trả lời cho câu hỏi cũ hơn với câu trả lời hiện có, sẽ rất hữu ích để giải thích những thông tin mới mà câu trả lời của bạn mang lại và xác nhận nếu thời gian trôi qua tác động đến câu trả lời.
Jason Aller

8

Thật vậy, window.location.origin hoạt động tốt trong các trình duyệt theo tiêu chuẩn, nhưng hãy đoán xem. IE không tuân theo các tiêu chuẩn.

Vì vậy, đây là những gì làm việc cho tôi trong IE, FireFox và Chrome:

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

nhưng để cải tiến trong tương lai có thể gây ra xung đột, tôi đã chỉ định tham chiếu "cửa sổ" trước đối tượng "vị trí".

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

6

Đây là giải pháp tôi đang sử dụng:

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

BIÊN TẬP:

Để thêm khả năng tương thích trình duyệt chéo, hãy sử dụng như sau:

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

1
Được nâng cấp, nhưng window.location.hostcó thể không phải là trình duyệt chéo tốt nhất
nathanfranke

1
Cảm ơn, tôi đã thêm khả năng tương thích trình duyệt vào câu trả lời ban đầu của mình.
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
xem xét giải thích câu trả lời của bạn. Đừng cho rằng OP có thể hiểu tầm quan trọng của các phần khác nhau trong mã của bạn.
ADyson

3

Hãy thử sử dụng một biểu thức chính quy (Regex), điều này sẽ khá hữu ích khi bạn muốn xác thực / trích xuất nội dung hoặc thậm chí thực hiện một số phân tích cú pháp đơn giản trong javascript.

Regex là:

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

Trình diễn:

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]

Bây giờ bạn có thể làm xác nhận là tốt.


"Lược đồ URL RFC 3986 hợp lệ phải bao gồm" một chữ cái và theo sau là bất kỳ tổ hợp chữ cái, chữ số nào, cộng ("+"), dấu chấm (".") Hoặc dấu gạch nối ("-"). "- stackoverflow. com / a / 9142331/188833 (Đây là một urn: ietf: rfc: 3897 (URI) / urn: ietf: rfc: 3897 (IRI) regex cho lược đồ: một phần của URI / IRI trong Python: github.com/dgerber /rfc3987/blob/master/rfc3987.py#L147 )
Wes Turner

2

Câu trả lời đơn giản phù hợp với tất cả các trình duyệ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

Phong cách ES6 với các thông số cấu hình.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.