Uzyskaj bieżącą nazwę domeny za pomocą Javascript (nie ścieżki itp.)

246

Planuję kupić dwie nazwy domen dla tej samej strony. W zależności od używanej domeny planuję podać nieco inne dane na stronie. Czy istnieje sposób, aby wykryć rzeczywistą nazwę domeny, z której ładuje się strona, aby wiedzieć, na co mam zmienić treść?

Rozglądałem się za takimi rzeczami, ale większość z nich nie działa tak, jak tego chcę.

Na przykład podczas używania

document.write(document.location)

na JSFiddle zwraca

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

tj. faktyczna ścieżka lub cokolwiek to jest.

Freesnöw
źródło
1
Nie jestem pewien, czy rozumiem dokładnie, co chcesz zrobić, ale prawdopodobnie powinieneś rzucić okiem na MDN w tym zakresie
MilkyWayJoe
Trochę tematu, ale możesz również rozważyć posiadanie subdomen zamiast dwóch oddzielnych nazw domen. Coś jak premium.random.comifree.random.com
T.Chmelevskij

Odpowiedzi:

456

Co powiesz na:

window.location.hostname

locationObiekt rzeczywiście ma wiele atrybutów odnoszące się do różnych części adresu URL

Gareth
źródło
55
i window.location.hostnamejeśli nie chcesz dostać port(jak http://localhost:3000/, window.location.host = 'localhost:3000'iwindow.location.hostname = 'localhost'
Guilherme
6
Odpowiedź jest nieprawidłowa, ponieważ port nie należy do domeny. I window.location.hostczasami zwróci port.
Andrej
4
To również zwraca nazwę serwera ( „www.amazingjokes.com”, zamiast po prostu „.amazingjokes.com”)
Patrick
Jeśli masz przekierowujący DNS, możesz potrzebować tego - window.location.ancestorOrigins
Kirill Gusyatin
126

Spróbuj uruchomić w skrypcie: ścieżka: http: // localhost: 4200 / landing? Query = 1 # 2

console.log(window.location.hash)

Lokalizacja ma następujące wartości:

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"
Sunil Shakya
źródło
3
To świetna odpowiedź!
Andrew Campbell,
2
Uwielbiam odpowiedzi z kilkoma przykładami. Dziękuje bardzo.
Magno Alberto
24

Jeśli nie jesteś zainteresowany nazwą hosta (na przykład www.beta.example.com), ale nazwą domeny (na przykład example.com), działa to w przypadku prawidłowych nazw hosta:

function getDomainName(hostName)
{
    return hostName.substring(hostName.lastIndexOf(".", hostName.lastIndexOf(".") - 1) + 1);
}
cprcrack
źródło
13
Niepoprawnie, spowoduje to uszkodzenie prawie wszystkich międzynarodowych TLD.
tbranyen
4
@tbranyen czy możesz wyjaśnić, o czym mówisz? Jedyny przypadek, o którym mogę pomyśleć, to subdomeny amazon.co.uk. Ale zdecydowanie nie „prawie wszystkie międzynarodowe domeny TLD”. W rzeczywistości działa ze 100% kodów krajów znalezionych w Wikipedii
cprcrack
1
cprcrack z jakiegoś powodu myślałem, że więcej międzynarodowych (do Ameryki) tlds zawierało wiele kropek. Dzięki za poprawienie!
tbranyen
Wiele krajów działa podobnie do Wielkiej Brytanii: mają ustalone domeny drugiego poziomu i możesz zarejestrować domeny tylko na trzecim poziomie. Lista tych krajów znajduje się na Wikipedii .
Gareth
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;
}

Przykłady

Poprzednia wersja otrzymywała pełną domenę (w tym subdomenę). Teraz określa właściwą domenę w zależności od preferencji. Tak więc, gdy drugi argument zostanie podany jako prawdziwy, będzie zawierać subdomenę, w przeciwnym razie zwróci tylko „domenę główną”

adelineu
źródło
1
To powinna być odpowiedź, działa nawet w localhost/test.phppoprawnej odpowiedzi localhost.
Mohammad AlBanna
Jest to również najlepsza odpowiedź, ponieważ działa z dowolnym przekazywanym adresem URL, a nie tylko z bieżącym window.location
sohtimsso1970
Jeśli to zrobisz google.co.uk, otrzymasz zwrot „co.uk”, co nie jest poprawne ...
James Douglas,
Tak. To trudna sprawa. Nawet trudniejsze, jeśli masz również subdomeny (na przykład: test.google.co.uk). Jeśli chcesz użyć tej surowej wersji, konieczne są poważne modyfikacje (może nawet dodanie specjalnej listy dla tych plików).
adelineu,
10

Możesz go łatwo pobrać z obiektu lokalizacji w JavaScript:

Na przykład adres URL tej strony to:

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

Następnie możemy uzyskać dokładną domenę z następującymi właściwościami obiektu lokalizacji:

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

możesz utworzyć pełną domenę za pomocą:

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

Który w tym przykładzie zwraca http://www.stackoverflow.com

Dodając to, możemy uzyskać pełny adres URL, a także ścieżkę z innymi właściwościami obiektu lokalizacji:

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"
Iman Sedighi
źródło
7

Jeśli interesuje Cię tylko nazwa domeny i chcesz zignorować subdomenę, musisz ją przeanalizować z hosti hostname.

Następujący kod to robi:

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
źródło
Dlaczego zwraca jShell zamiast jsFiddle?
Freesnöw
2
@XanderLamkins: iframe: jsfiddle.net/5U366 <-> fiddle.jshell.net/5U366/show
Saxoier
7

Ponieważ pytanie to wymaga nazwy domeny, a nie nazwy hosta, należy odpowiedzieć poprawnie

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

Działa to również w przypadku nazw hostów takich jak www.example.com .

Ethan
źródło
1
To działa, ale nie działa z domenami takimi jak domain.co.uk, domain.com.br .. Jak mogę sprawić, by działał z dowolną domeną?
Sameh
6

Posługiwać się

document.write(document.location.hostname)​

window.locationma wiele właściwości. Zobacz tutaj ich listę.

Dancrumb
źródło
5

Jeśli chcesz mieć pełne pochodzenie domeny, możesz użyć tego:

document.location.origin

A jeśli chcesz uzyskać tylko domenę, skorzystaj z tego:

document.location.hostname

Ale masz inne opcje, spójrz na właściwości w:

document.location
Ricardo França
źródło
5

Co z tą funkcją?

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

Spowoduje to dopasowanie tylko nazwy domeny, niezależnie od tego, czy jest to subdomena, czy domena główna

unixdebian11
źródło
1
Podoba mi się ta odpowiedź. Pamiętaj jednak, że jeśli używasz go do celów związanych z bezpieczeństwem, można go ominąć. To znaczy, jeśli chcesz mieć pewność, że jesteś na example.com, wtedy hacker-example.com również będzie równy „example.com”. window.location.hostname.match (/ [a-zA-Z0-9 -] * \. [a-zA-Z0-9 -] * $ /) [0] działa.
hiburn8
4

Jeśli chcesz uzyskać nazwę domeny w JavaScript, wystarczy użyć następującego kodu:

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

Jeśli potrzebujesz ścieżki URL strony internetowej, aby uzyskać dostęp do ścieżki URL, skorzystaj z tego przykładu:

var url = document.URL;
alert(url);
ujjal
źródło
2

w moim przypadku najlepsze dopasowanie to window.location.origin

Pavel Poberezhnyi
źródło
1

Jestem nowy w JavaScript, ale nie możesz po prostu użyć: document.domain ?

Przykład:

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

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

Wynik:

domain.com

lub

www.domain.com

W zależności od tego, czego używasz na swojej stronie.

UnluckyLuke
źródło
0

Myślę, że powinno to być tak proste:

url.split("/")[2]

Alexandru Mihalcea
źródło
Pracuje dla mnie. Poprzednie rozwiązania opierają się na dokumencie, lokalizacji lub obiekcie okna.
Cris
0

Łącząc kilka odpowiedzi z powyższego, poniższe działania działają naprawdę dobrze dla mnie w przypadku niszczenia plików cookie:

  /**
   * 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]}`;
  }

Działa dla adresów IP z portami, np. 0.0.0.0:8000 itp., A także dla złożonych domen, takich jak app.staging.example.comreturning .example.com=>, pozwala na ustawienie i niszczenie plików cookie między domenami.

Micheal J. Roberts
źródło
0

Jeśli chcesz nazwę domeny kraju - na przykład, aby wyodrębnić  .com   z 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;
}

Następnie wystarczy użyć funkcji, aby przypisać wartość do var:

const countryDomainName = getCountryDomainName();
Nadav
źródło
-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

Rzeczywiście pracował dla mnie, podczas gdy nie mogłem używać PHP

Właśnie przetestowałem, że zadziałało dzięki podejściu wspomnianemu powyżej w niektórych odpowiedziach, więc szybko i zweryfikowałem, że zadziałało

Jean Paul AKA el_vete
źródło
@Brandito Dzięki, dobrze, ta strona była hostowana na wirtualnym hoście AWS. Wierzę, że korzystam z wordpress i nie wiem, dlaczego to robiło problemy w ten sposób ... Nie jestem pewien, czy to było złe przekierowanie czy coś takiego musiało zrobić z zasadami przepisywania modów przepisywania .. Plus Chciałem użyć wraz z nim narzędzi i ikonki interfejsu użytkownika jquery. Zatwierdzone przez klienta najpierw: „-)
Jean Paul AKA el_vete