Получить текущее доменное имя с Javascript (не путь и т. Д.)

246

Я планирую купить два доменных имени для одного сайта. В зависимости от того, какой домен используется, я планирую предоставить немного разные данные на странице. Могу ли я определить фактическое доменное имя, с которого загружается страница, чтобы я знал, на что изменить содержимое?

Я искал подобные вещи, но большинство из них не работает так, как я хочу.

Например, при использовании

document.write(document.location)

на JSFiddle возвращается

http://fiddle.jshell.net/_display/

то есть фактический путь или что-то еще.

Freesnöw
источник
1
Я не уверен, правильно ли я понимаю, что вы хотите сделать, но вам, вероятно, стоит взглянуть на MDN по этому поводу
MilkyWayJoe
Немного темы, но вы также можете рассмотреть возможность создания поддоменов, а не двух отдельных доменных имен. Нечто подобное premium.random.comиfree.random.com
Т.Чмелевский

Ответы:

456

Как насчет:

window.location.hostname

locationОбъект на самом деле имеет ряд атрибутов , относящихся к различным частям URL

Gareth
источник
55
и window.location.hostnameесли вы не хотите, чтобы получить port(как http://localhost:3000/, window.location.host = 'localhost:3000'иwindow.location.hostname = 'localhost'
Гильерме
6
Ответ неправильный, потому что порт не принадлежит домену. И window.location.hostиногда вернет порт.
Андрей
4
Это также возвращает имя сервера («www.amazingjokes.com», а не просто «.amazingjokes.com»)
Патрик
Если у вас есть переадресация DNS, вам может понадобиться этот - window.location.ancestorOrigins
Кирилл Гусятин
128

Попробуйте запустить в сценарии: путь: http: // localhost: 4200 / landing? Query = 1 # 2

console.log(window.location.hash)

Местоположение имеет следующие значения:

window.location.hash: "#2"

window.location.host: "localhost:4200"

window.location.hostname: "localhost"

window.location.href: "http://localhost:4200/landing?query=1#2"

window.location.origin: "http://localhost:4200"

window.location.pathname: "/landing"

window.location.port: "4200"

window.location.protocol: "http:"

window.location.search: "?query=1"
Сунил Шакья
источник
3
Это такой отличный ответ!
Эндрю Кэмпбелл
2
Я люблю ответы с несколькими примерами. Огромное спасибо.
Маньо Альберто
24

Если вас интересует не имя хоста (например www.beta.example.com), а имя домена (например example.com), это работает для допустимых имен хостов:

function getDomainName(hostName)
{
    return hostName.substring(hostName.lastIndexOf(".", hostName.lastIndexOf(".") - 1) + 1);
}
cprcrack
источник
13
Неправильно, это сломает почти все международные TLD.
tbranyen
4
@tbranyen Можете ли вы объяснить, что вы имеете в виду? Единственный случай, о котором я могу подумать - это субдомены типа amazon.co.uk. Но определенно не «почти все международные ДВУ». Фактически это работает со 100% кодов стран, найденных в Википедии
cprcrack
1
По какой-то причине cprcrack я думал, что в более международных (в Америке) текстах содержится несколько точек. Спасибо за исправление!
tbranyen
Ряд стран работает аналогично Великобритании: у них есть фиксированные домены второго уровня, и вы можете регистрировать домены только на третьем уровне. Список этих стран находится в Википедии .
Гарет
18
function getDomain(url, subdomain) {
    subdomain = subdomain || false;

    url = url.replace(/(https?:\/\/)?(www.)?/i, '');

    if (!subdomain) {
        url = url.split('.');

        url = url.slice(url.length - 2).join('.');
    }

    if (url.indexOf('/') !== -1) {
        return url.split('/')[0];
    }

    return url;
}

Примеры

Предыдущая версия получала полный домен (включая поддомен). Теперь он определяет правильный домен в зависимости от предпочтений. Таким образом, если второй аргумент указан как true, он будет включать поддомен, в противном случае он возвращает только «основной домен»

adelineu
источник
1
Это должен быть ответ, он работает даже в том, localhost/test.phpи это правильный ответ localhost.
Мохаммед АльБанна
Это также лучший ответ, потому что он работает с любым URL-адресом, который вы передаете, а не только с текущим window.location
sohtimsso1970
Если вы сделаете это google.co.ukдля, вы получите «co.uk» обратно, что не правильно ...
Джеймс Дуглас
Да. Это сложный бизнес. Еще сложнее, если у вас есть поддомен (например: test.google.co.uk). Если вы хотите использовать эту необработанную версию, необходимо внести некоторые серьезные изменения (возможно, даже добавив специальный список для этих слов).
adelineu
10

Вы можете легко получить его из объекта местоположения в Javascript:

Например, URL этой страницы:

http://www.stackoverflow.com/questions/11401897/get-the-current-domain-name-with-javascript-not-the-path-etc

Тогда мы можем получить точный домен со следующими свойствами объекта местоположения:

location.host = "www.stackoverflow.com"
location.protocol= "http:"

Вы можете сделать полный домен с:

location.protocol + "//" + location.host

Который в этом примере возвращает http://www.stackoverflow.com

В дополнение к этому мы можем получить полный URL, а также путь с другими свойствами объекта местоположения:

location.href= "http://www.stackoverflow.com/questions/11401897/get-the-current-domain-name-with-javascript-not-the-path-etc"    
location.pathname= "questions/11401897/get-the-current-domain-name-with-javascript-not-the-path-etc"
Иман Седиги
источник
7

Если вас интересует только доменное имя и вы хотите игнорировать поддомен, вам нужно разобрать его hostиhostname .

Следующий код делает это:

var firstDot = window.location.hostname.indexOf('.');
var tld = ".net";
var isSubdomain = firstDot < window.location.hostname.indexOf(tld);
var domain;

if (isSubdomain) {
    domain = window.location.hostname.substring(firstDot == -1 ? 0 : firstDot + 1);
}
else {
  domain = window.location.hostname;
}

http://jsfiddle.net/5U366/4/

dmck
источник
Почему он возвращает jShell вместо jsFiddle?
Freesnöw
2
@XanderLamkins: это iframe: jsfiddle.net/5U366 <-> fiddle.jshell.net/5U366/show
Саксойер
7

Поскольку этот вопрос требует имени домена, а не имени хоста, правильный ответ должен быть

window.location.hostname.split('.').slice(-2).join('.')

Это работает для имен хостов, таких как www.example.com .

Итан
источник
1
Это работает, но не работает с доменами, такими как domain.co.uk, domain.com.br .. Как я могу заставить его работать с любым доменом?
Самех
6

использование

document.write(document.location.hostname)​

window.locationимеет кучу свойств. Смотрите здесь для их списка.

Dancrumb
источник
5

Если вы хотите полное происхождение домена, вы можете использовать это:

document.location.origin

И если вы хотите получить только домен, воспользуйтесь этим:

document.location.hostname

Но у вас есть другие варианты, взгляните на свойства в:

document.location
Рикардо Франса
источник
5

Как насчет этой функции?

window.location.hostname.match(/\w*\.\w*$/gi)[0]

Это будет соответствовать только имени домена, независимо от того, является ли он поддоменом или основным доменом.

unixdebian11
источник
1
Мне нравится этот ответ. Но вы должны знать, что если использовать его в целях безопасности .. это можно обойти. Т.е. если вы хотите убедиться, что вы находитесь на example.com, то hacker-example.com также будет равняться 'example.com'. window.location.hostname.match (/ [a-zA-Z0-9 -] * \. [a-zA-Z0-9 -] * $ /) [0] работает.
hiburn8
4

Если вы хотите получить доменное имя в JavaScript, просто используйте следующий код:

var domain_name = document.location.hostname;
alert(domain_name);

Если вам нужен URL-путь к веб-странице, чтобы вы могли получить доступ к URL-адресу, используйте этот пример:

var url = document.URL;
alert(url);
ujjal
источник
2

для моего случая лучшее соответствие - window.location.origin

Павел Побережный
источник
1

Я новичок в JavaScript, но вы не можете просто использовать: document.domain ?

Пример:

<p id="ourdomain"></p>

<script>
var domainstring = document.domain;
document.getElementById("ourdomain").innerHTML = (domainstring);
</script>

Вывод:

domain.com

или

www.domain.com

В зависимости от того, что вы используете на своем сайте.

UnluckyLuke
источник
0

Я думаю, это должно быть так просто:

url.split("/")[2]

Александру Михальча
источник
Работает для меня. Предыдущие решения основаны на документе, местоположении или объекте окна.
Cris
0

Комбинируя несколько ответов из вышеизложенного, для уничтожения куки-файлов мне очень подходит следующее:

  /**
   * Utility method to obtain the domain URI:
   */
  fetchDomainURI() {
    if (window.location.port.length > 0) {
      return window.location.hostname;
    }
    return `.${window.location.hostname.match(/\w*\.\w*$/gi)[0]}`;
  }

Работы по IP - адресам с портами, например, 0.0.0.0:8000 и т.д., а также сложные области , как app.staging.example.comвозвращение .example.com=> позволяет междоменной установку Cookie и уничтожению.

Майкл Дж. Робертс
источник
0

Если вы хотите, чтобы доменное имя страны - например, для извлечения  .com   из stackoverflow.com:

(ES6):

const getCountryDomainName = () => {
  let hostName = window.location.hostname;
  let lastDotIndex = hostName.lastIndexOf('.');
  let countryDomainName = hostName.substr(lastDotIndex+1, hostName.length);
  return countryDomainName;
}

(ES5):

function getCountryDomainName() {
  let hostName = window.location.hostname;
  let lastDotIndex = hostName.lastIndexOf('.');
  let countryDomainName = hostName.substr(lastDotIndex+1, hostName.length);
  return countryDomainName;
}

Затем просто используйте функцию, чтобы присвоить значение переменной:

const countryDomainName = getCountryDomainName();
Надав
источник
-2
       Feel free to visit our “<a href="javascript:document.location.href=document.location.origin+'/contact-us'" title="Click to Contact Us" class="coded_link" ><span class="ui-icon ui-icon-newwin"></span>Contact</a>” link

Действительно работал для меня, тогда как я не мог использовать PHP

Только что проверил, что это работает благодаря подходу, упомянутому выше в некоторых ответах, настолько быстро и проверено, что сработало

Жан Поль АКА el_vete
источник
@Brandito Спасибо, хорошо, что этот сайт был размещен на виртуальном хосте AWS. Я полагаю, что он использовал WordPress и не знаю, почему он создавал проблемы с таким способом ... Не уверен, что это было неправильное перенаправление или что-то, что должно было сделать с правилами перезаписи мода для бэкенда. Плюс я хотел использовать jipery ui themed toolip и иконку вместе с ним.
Первоначально