location.host vs location.hostname and cross-browser compatibility?
Asked Answered
B

7

500

Which one of these is the most effective vs checking if the user agent is accessing via the correct domain.

We would like to show a small js based 'top bar' style warning if they are accessing the domain using some sort of web proxy (as it tends to break the js).

We were thinking about using the following:

var r = /.*domain\.com$/;
if (r.test(location.hostname)) {
    // showMessage ...
}

That would take care of any subdomains we ever use.

Which should we use host or hostname?

In Firefox 5 and Chrome 12:

console.log(location.host);
console.log(location.hostname);

.. shows the same for both.

Is that because the port isn't actually in the address bar?

W3Schools says host contains the port.

Should location.host/hostname be validated or can we be pretty certain in IE6+ and all the others it will exist?

Breed answered 17/7, 2011 at 18:34 Comment(3)
One thing to note is that google chrome has a location.origin, where MSIE and Firefox do not. developer.mozilla.org/En/Window.location - msdn.microsoft.com/en-us/library/ms952653.aspxPlausive
See also: Whats the difference between window.location.host and window.location.hostnameCamera
possible duplicate of Whats the difference between window.location.host and window.location.hostnameNecessitous
J
1401

interactive link anatomy

As a little memo: the interactive link anatomy

--

In short (assuming a location of http://example.org:8888/foo/bar#bang):

  • hostname gives you example.org
  • host gives you example.org:8888
Jactitation answered 8/7, 2012 at 0:35 Comment(3)
A picture is worth a thousand words.Tucson
According to en.wikipedia.org/wiki/…, the port should not be consider a part of the host (but it is a part of the authority).Microwatt
@Alec this is an interesting technical note; drilling down thru the Wikipedia citation reveals that, according to RFC 3986, "authority" ought to be the term for the concatenation of the hostname, :, and port. I wonder how much of the discussion is still available from when location.host was being formulated... I suspect it's named such today because nobody present had read or thought to mention that RFC.Chavey
K
80

host just includes the port number if there is one specified. If there is no port number specifically in the URL, then it returns the same as hostname. You pick whether you care to match the port number or not. See https://developer.mozilla.org/en-US/docs/Web/API/Location for more info on the window.location object and the various choices it has for matching (with or without port).

I would assume you want hostname to just get the site name.

Krug answered 17/7, 2011 at 18:37 Comment(3)
The links is broken now :(Bunkmate
Use this instead: developer.mozilla.org/en-US/docs/Web/API/Window/locationBunkmate
@Stranger - Edited my post to update the link.Krug
S
37

If you are insisting to use the window.location.origin You can put this in top of your code before reading the origin

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

Solution

PS: For the record, it was actually the original question. It was already edited :)

Sadiras answered 15/3, 2014 at 13:1 Comment(2)
But.... OP never mentioned window.location.origin in their question. Their question was actually specifically regarding things that are not window.location.origin.Jennifer
It's also worth noting that window.location.origin has browser compatibility issues. developer.mozilla.org/en-US/docs/Web/API/Window/…Misname
S
10

Your primary question has been answered above. I just wanted to point out that the regex you're using has a bug. It will also succeed on foo-domain.com which is not a subdomain of domain.com

What you really want is this:

/(^|\.)domain\.com$/
Salema answered 25/2, 2014 at 5:1 Comment(0)
W
4

MDN: https://developer.mozilla.org/en/DOM/window.location

It seems that you will get the same result for both, but hostname contains clear host name without brackets or port number.

Willpower answered 17/7, 2011 at 18:39 Comment(0)
S
4

Just to add a note that Google Chrome browser has origin attribute for the location. which gives you the entire domain from protocol to the port number as shown in the below screenshot. chrome developers tool

Sequela answered 31/7, 2018 at 10:17 Comment(0)
S
3

From the mdn web docs you can see an interactive location demo where you can hover over the elements to highlight their meaning:

enter image description here

Sukkoth answered 22/6, 2023 at 12:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.