Pobierz aktualną domenę


140

Mam swoją witrynę na serwerze

http://www.myserver.uk.com

Do tego mam dwie domeny,

http://one.com

i

http://two.com

Chciałbym dostać się z bieżącą domeną PHP, ale jeśli używam, $_SERVER['HTTP_HOST']to pokaż mi

myserver.uk.com

zamiast:

one.com or two.com

Jak mogę uzyskać domenę, a nie nazwę serwera?

Mam PHP w wersji 5.2.


Możesz uzyskać tylko podstawowy adres URl. Który z tych trzech jest Podstawowy?
Code Spy

2
Jak dokładnie Twoje dwie domeny przekierowują żądania na Twój serwer?
xiaofeng.li

1
@infgeoax prawdopodobnie ramka ...
CodeCaster

głównym jest myserver.uk.com. więc jak mogę uzyskać aktualną nazwę domeny? Jeśli otworzę witrynę z adresem one.com, chciałbym uzyskać one.com zamiast myserver.uk.com
Tony Evyght

@TonyEvyght, to jest punkt, który infgeoax i ja próbuję zrobić, powinieneś uzyskać nazwę hosta, z którym się łączysz $_SERVER['HTTP_HOST']. W przypadku witryn one.comi two.comsą „przekierowanie” za pomocą (i) ramki, sama strona wciąż pochodzi z myserver.uk.com, więc nie dostaniesz prawdziwą domenę. Do czego służy źródło HTML one.com?
CodeCaster

Odpowiedzi:


175

Spróbuj użyć tego: $_SERVER['SERVER_NAME']

Albo przeanalizuj

$_SERVER['REQUEST_URI']

apache_request_headers ()


23
-1: Przy samej tej odpowiedzi nie wiem dokładnie, jakie są różne sugestie, na które patrzę. Jasne, to daje mi punkt do dalszego patrzenia, ale samo w sobie nie jest to dobra odpowiedź ...
Jasper

4
po prostu print_r (apache_request_headers ()) i zrozumiesz wszystko :)
połowa

2
@SarahLewis HTTP_X_ORIGINAL_HOSTmoże być modyfikowany przez użytkownika i nie można mu ufać. Nie zawsze może to stanowić problem, ale należy o tym pamiętać.
wp-overwatch.com

64

Najlepszym zastosowaniem byłoby

echo $_SERVER['HTTP_HOST'];

Można go używać w ten sposób:

if (strpos($_SERVER['HTTP_HOST'], 'banana.com') !== false) {
    echo "Yes this is indeed the banana.com domain";
}

Poniższy kod to dobry sposób, aby zobaczyć wszystkie zmienne w $ _SERVER w ustrukturyzowanym wyniku HTML z podświetlonymi słowami kluczowymi, które zatrzymują się bezpośrednio po wykonaniu. Ponieważ czasami zapominam, którego użyć, myślę, że to może być fajne.

<?php
    // Change banana.com to the domain you were looking for..
    $wordToHighlight = "banana.com";
    $serverVarHighlighted = str_replace( $wordToHighlight, '<span style=\'background-color:#883399; color: #FFFFFF;\'>'. $wordToHighlight .'</span>',  $_SERVER );
    echo "<pre>";
    print_r($serverVarHighlighted);
    echo "</pre>";
    exit();
?>

39

Użycie $_SERVER['HTTP_HOST']pobiera mnie (subdomena) maindomain.extension. Wydaje mi się, że to najłatwiejsze rozwiązanie.

Jeśli faktycznie „przekierowujesz” przez element iFrame, możesz dodać parametr GET określający domenę.

<iframe src="myserver.uk.com?domain=one.com"/>

Następnie możesz ustawić zmienną sesji, która utrwala te dane w całej aplikacji.


1
przede wszystkim zawiera numer portu, więc nie muszę go później łączyć. phpinfo sugerowane przez bsdnoobz pomaga mi jednak znaleźć właściwe rozwiązanie.

30

Jedyny bezpieczny sposób na zrobienie tego

Wszystkie inne odpowiedzi na tej stronie mają wpływ na bezpieczeństwo, o którym musisz wiedzieć.

Jedyna gwarantowana bezpieczna metoda pobierania bieżącej domeny jest do 𝓼𝓽𝓸𝓻𝓮 𝓲𝓽 𝓲𝓷 𝓪 𝓼𝓮𝓬𝓾𝓻𝓮 𝓵𝓸𝓬𝓪𝓽𝓲𝓸𝓷 𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯.

Większość frameworków zajmuje się przechowywaniem domeny za Ciebie, więc będziesz chciał zapoznać się z dokumentacją dla twojego konkretnego frameworka. Jeśli nie korzystasz z frameworka, rozważ przechowywanie domeny w jednym z następujących miejsc:

+ ------------------------------------------------- --- + ----------------------------------- +
 | Bezpieczne metody przechowywania domeny | Używany przez |
+ ------------------------------------------------- --- + ----------------------------------- +
 | Plik konfiguracyjny | Joomla, Drupal / Symfony |
 | Baza danych | WordPress |
 | Zmienna środowiskowa | Laravel |
 | Rejestr usług | Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +


Możesz użyć następujących ... ale są one niebezpieczne

Hakerzy mogą tworzyć te zmienne w dowolnej domenie. Może to prowadzić do zatrucia pamięci podręcznej i ledwo zauważalnych ataków phishingowych.

$_SERVER['HTTP_HOST']

To pobiera domenę z nagłówków żądań, które są otwarte na manipulację przez hakerów . Tak samo z:

$_SERVER['SERVER_NAME']

Można to ulepszyć, jeśli ustawienie Apache usecanonicalname jest wyłączone; w takim przypadku $_SERVER['SERVER_NAME']nie będzie już można wypełniać dowolnymi wartościami i będzie bezpieczne. Nie jest to jednak domyślne i nie jest tak powszechne w przypadku konfiguracji.


W popularnych systemach

Poniżej przedstawiamy, w jaki sposób można uzyskać bieżącą domenę w następujących frameworkach / systemach:

WordPress

$urlparts = parse_url(home_url());
$domain = $urlparts['host'];

Jeśli tworzysz adres URL w WordPress, po prostu użyj home_url lub site_url lub dowolnej innej funkcji adresu URL .

Laravel

request()->getHost()

request()->getHostFunkcja jest dziedziczona z Symfony, i był bezpieczny od 2013 r CVE-2013-4752 została załatana.

Drupal

Instalator nie zadbał jeszcze o zapewnienie bezpieczeństwa ( numer 2404259 ). Ale w Drupalu 8 jest dokumentacja, którą możesz śledzić w Ustawieniach zaufanego hosta, aby zabezpieczyć swoją instalację Drupala, po czym można użyć następujących elementów:

\Drupal::request()->getHost();

Inne ramy

Możesz edytować tę odpowiedź, aby uwzględnić, jak uzyskać bieżącą domenę w ulubionym frameworku. Czyniąc to, dołącz link do odpowiedniego kodu źródłowego lub do czegokolwiek innego, co pomogłoby mi sprawdzić, czy framework działa bezpiecznie.




Uzupełnienie

Przykłady wykorzystania:

  1. Zatruwanie pamięci podręcznej może się zdarzyć, jeśli botnet stale żąda strony, używając niewłaściwego nagłówka hosta. Wynikowy kod HTML będzie następnie zawierał łącza do witryny internetowej osoby atakującej, z której mogą wyłudzić użytkowników. Początkowo złośliwe odsyłacze będą odsyłane tylko do hakera, ale jeśli haker wykona wystarczającą liczbę żądań, złośliwa wersja strony trafi do pamięci podręcznej, gdzie zostanie rozesłana do innych użytkowników.

  2. Atak phishingowy może się zdarzyć, jeśli przechowujesz linki w bazie danych na podstawie nagłówka hosta. Załóżmy na przykład, że przechowujesz bezwzględny adres URL do profili użytkownika na forum. Używając niewłaściwego nagłówka, haker może skłonić każdego, kto kliknie łącze do jego profilu, w celu wysłania strony phishingowej.

  3. Zatrucie resetowania hasła może się zdarzyć, jeśli haker użyje nagłówka złośliwego hosta podczas wypełniania formularza resetowania hasła dla innego użytkownika. Ten użytkownik otrzyma następnie wiadomość e-mail zawierającą łącze do resetowania hasła, które prowadzi do witryny phishingowej.

  4. Oto kilka bardziej złośliwych przykładów

Dodatkowe ostrzeżenia i uwagi:

  • Kiedy usecanonicalname jest wyłączone, $_SERVER['SERVER_NAME']jest wypełniane tym samym nagłówkiem, $_SERVER['HTTP_HOST']który zostałby użyty i tak (plus port). To jest domyślna konfiguracja Apache. Jeśli ty lub devops włączysz to, wszystko w porządku - tak - ale czy naprawdę chcesz polegać na oddzielnym zespole lub na sobie za trzy lata, aby zachować to, co wydawałoby się drobną konfiguracją w innym -domyślna wartość? Mimo że zapewnia to bezpieczeństwo, ostrzegałbym przed poleganiem na tej konfiguracji.
  • Jednak Redhat domyślnie włącza tryb kanoniczny [ źródło ].
  • Jeśli serverAlias jest używany we wpisie hostów wirtualnych i zażądano domeny z aliasem , $_SERVER['SERVER_NAME']nie zwróci bieżącej domeny, ale zwróci wartość dyrektywy serverName.
  • Jeśli nie można rozwiązać nazwy_serwera, zamiast niej używana jest komenda nazwa_hosta systemu operacyjnego [źródło] .
  • Jeśli nagłówek hosta zostanie pominięty, serwer będzie się zachowywał tak, jakby usecanonical znajdował się na [source] .
  • Wreszcie, po prostu próbowałem wykorzystać to na moim lokalnym serwerze i nie mogłem sfałszować nagłówka hosta. Nie jestem pewien, czy pojawiła się aktualizacja Apache, która rozwiązała ten problem, czy po prostu robiłem coś źle. Niezależnie od tego nagłówek ten byłby nadal możliwy do wykorzystania w środowiskach, w których nie są używane wirtualne hosty.

Mała Rant:

     To pytanie otrzymało setki tysięcy wyświetleń bez ani jednej wzmianki o problemach z bezpieczeństwem! Nie powinno tak być, ale tylko dlatego, że odpowiedź przepełnienia stosu jest popularna, nie oznacza to, że jest bezpieczna.




1
Możesz wspomnieć o różnicy między home_url i site_url. wordpress.stackexchange.com/a/50605/13
Volomike

1
+1 dla użytkowników wordpress. Dobrze, jeśli chcesz sprawdzić, czy jest zainstalowany w podkatalogu, ale zwróć uwagę, że klucz parse_url: $urlparts['path']nie jest ustawiony, jeśli jest zainstalowany w katalogu głównym domeny. W przeciwnym razie $urlparts['path']zwraca podkatalog.
Jonas Lundman

9

Spróbuj $_SERVER['SERVER_NAME'].

Wskazówki: Utwórz plik PHP wywołujący tę funkcję phpinfo()i zobacz sekcję „Zmienne PHP”. Istnieje wiele przydatnych zmiennych, o których nigdy nie myślimy.


zawsze możesz spróbować wydrukować_r-ing $ _SERVER i wyszukać

3

Wiem, że może to nie być do końca na ten temat, ale z mojego doświadczenia wynika, że ​​przechowywanie WWW-ności bieżącego adresu URL w zmiennej jest przydatne.

Edycja: Ponadto, zobacz mój komentarz poniżej, aby zobaczyć, do czego to zmierza.

Jest to ważne przy określaniu, czy wywołania Ajax mają być wysyłane z „www”, czy bez:

$.ajax("url" : "www.site.com/script.php", ...

$.ajax("url" : "site.com/script.php", ...

Podczas wysyłania połączenia Ajax nazwa domeny musi być zgodna z nazwą domeny w pasku adresu przeglądarki, w przeciwnym razie w konsoli wystąpi błąd Uncaught SecurityError .

Więc wymyśliłem to rozwiązanie, aby rozwiązać problem:

<?php
    substr($_SERVER['SERVER_NAME'], 0, 3) == "www" ? $WWW = true : $WWW = false;

    if ($WWW) {
        /* We have www.example.com */
    } else {
        /* We have example.com */
    }
?>

Następnie, w oparciu o to, czy $ WWW jest prawdziwe, czy fałszywe, uruchom odpowiednie wywołanie Ajax.

Wiem, że to może brzmieć banalnie, ale jest to tak powszechny problem, o który łatwo się potknąć.


OP wyraźnie poprosił o domenę, a nie o SERVER_NAME .
Sebastian G. Marinescu

To prawda, ale w dzisiejszych czasach musisz też martwić się o problem z www.
InfiniteStack

Czemu? W JS możesz zajrzeć window.location. W PHP masz SERVER_NAME.
Sebastian G. Marinescu

4
SERVER_NAME zwraca „www.witryna.com” nawet wtedy, gdy „witryna.com” jest wpisana w pasku adresu. Jeśli używasz usługi SERVER_NAME w całym kodzie, nieuchronnie napotkasz problem z bezpieczeństwem www / no-www, szczególnie jeśli chodzi o wykonywanie połączeń Ajax. Ale żeby odpowiedzieć na twoje pytanie, w zaawansowanym programowaniu PHP czasami PHP musi dynamicznie generować kod, który wykonuje wywołanie HTTP do serwera. Jeśli docelowy adres URL zawiera „www” na stronie, która go nie zawiera, spowoduje to błąd zabezpieczeń.
InfiniteStack

Ok ok ... Czytałem o tym i masz rację. Twoja odpowiedź może być odpowiednia dla kogoś. Dobra robota :)
Sebastian G. Marinescu

3

Wszyscy używają tej parse_urlfunkcji, ale czasami użytkownik może przekazać argumet w innym formacie.

Aby to naprawić, stworzyłem funkcję. Sprawdź to:

function fixDomainName($url='')
{
    $strToLower = strtolower(trim($url));
    $httpPregReplace = preg_replace('/^http:\/\//i', '', $strToLower);
    $httpsPregReplace = preg_replace('/^https:\/\//i', '', $httpPregReplace);
    $wwwPregReplace = preg_replace('/^www\./i', '', $httpsPregReplace);
    $explodeToArray = explode('/', $wwwPregReplace);
    $finalDomainName = trim($explodeToArray[0]);
    return $finalDomainName;
}

Po prostu podaj adres URL i uzyskaj domenę.

Na przykład,

echo fixDomainName('https://stackoverflow.com');

zwróci wynik będzie

stackoverflow.com

A w jakiejś sytuacji:

echo fixDomainName('stackoverflow.com/questions/id/slug');

I to też wróci stackoverflow.com.


1
$_SERVER['HTTP_HOST'] 

// aby pobrać domenę

$protocol=strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === FALSE ? 'http' : 'https';
$domainLink=$protocol.'://'.$_SERVER['HTTP_HOST'];

// domena z protokołem

$url=$protocol.'://'.$_SERVER['HTTP_HOST'].'?'.$_SERVER['QUERY_STRING'];

// protokół, domena, queryString łącznie ** Ponieważ $ _SERVER ['SERVER_NAME'] nie jest niezawodne w przypadku hostingu w wielu domenach!


-2

Po prostu spróbuj:

echo apache_request_headers()[3];
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.