Získání názvu domény v jazyce PHP

Výpis domény v jazyce PHP: Z URL, e-mailu nebo aktuální stránky Při vývoji backendu v jazyce PHP je extrakce názvů domén často nutná pro úlohy, jako je vytváření kanonických adres...

Poptat web

26. 11. 2025

Získání názvu domény v jazyce PHP

Výpis domény v jazyce PHP: Z URL, e-mailu nebo aktuální stránky

Při vývoji backendu v jazyce PHP je extrakce názvů domén často nutná pro úlohy, jako je vytváření kanonických adres URL, rozbor odkazů nebo e-mailů zadaných uživatelem, směrování, protokolování nebo ověřování. V tomto článku se budeme zabývat tím, jak získat názvy domén v jazyce PHP v několika reálných kontextech: z aktuálního požadavku, z řetězce URL nebo z e-mailové adresy. Zabýváme se také tím, jak zpracovat schéma (http/https) a volitelně odstranit subdomény, abychom získali "základní" nebo registrovatelnou doménu.

Získání domény aktuální stránky

Chcete-li získat doménu použitou v aktuálním požadavku, tedy adresu webu, na kterém běží váš kód PHP, můžete se spolehnout na funkci PHP $_SERVER superglobální proměnné:

$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'];
$domain = $scheme . '://' . $host;
echo $domain;

Vysvětlení:

  • $_SERVER['HTTP_HOST'] uvádí hlavičku hostitele odeslanou klientem (může obsahovat port).
  • Jako záložní řešení, $_SERVER['SERVER_NAME'] lze použít, pokud HTTP_HOST není nastaven.
  • Zjistíme schéma (HTTPS nebo HTTP) a sestavíme úplnou adresu URL včetně protokolu.

Tento přístup poskytuje přesnou doménu (a případně port), kterou uživatel použil k vyžádání stránky. Běžně se používá pro generování kanonických adres URL nebo přesměrování.

Bezpečnostní poznámka: Protože HTTP_HOST je odvozena ze záhlaví poskytnutého klientem, lze ji podvrhnout. U úloh citlivých na zabezpečení (ověřování, generování tokenů, řízení přístupu) se vyhněte důvěře v tyto nástroje. HTTP_HOST. Místo toho použijte pevnou konfigurační hodnotu nebo název řízený serverem.

Extrakce domény z řetězce URL

Pokud máte k dispozici adresu URL (z uživatelského vstupu, konfigurace, referenčních dat atd.) a chcete extrahovat její doménu, vestavěná funkce PHP parse_url() je standardní nástroj:

$url = 'https://www.example.com/path/page.php?foo=bar';
$host = parse_url($url, PHP_URL_HOST);
echo $host; // e.g. "www.example.com"

parse_url() analyzuje adresu URL na složky (schéma, hostitel, cesta, dotaz, fragment atd.). Pomocí PHP_URL_HOST vrátí složku hostitele (domény) jako řetězec.

Tato funkce funguje spolehlivě, pokud je vstupem úplná a platná adresa URL.

Omezení a výhrady:

  • Pokud adresa URL neobsahuje schéma (např. "example.com/path"), parse_url() může chybně interpretovat řetězec jako relativní cestu a hostitele se nepodaří extrahovat.
  • Pokud je adresa URL chybně vytvořena nebo není správně zakódována, může parsování přinést neočekávané výsledky nebo vrátit hodnotu. null.

Proto je při práci s uživatelským nebo externím vstupem vhodné nejprve ověřit nebo normalizovat adresu URL (například tím, že se ujistíte, že má schéma), než zavoláte parse_url().

Získat doménu bez subdomény

Ve výchozím nastavení, parse_url() vrátí celého hostitele včetně všech subdomén. Například z https://sub.www.example.co.uk, získáte sub.www.example.co.uk. Často chcete pouze "základní" nebo "registrovatelnou" doménu (např. example.co.uk).

Naivní způsob odstranění subdomén může vypadat takto:

$host = parse_url($url, PHP_URL_HOST);
$host = preg_replace('/^www\./i', '', $host);

Tím se řeší běžný případ "www." předpona. Tento přístup však selhává, když:

  • Subdoména není "www" (např. api.example.com, blog.example.co.uk).
  • Doména má vícedílnou TLD (např. .co.uk, .org.au), přičemž pouhé převzetí posledních dvou značek může být nesprávné.
  • Existují hlubší subdomény (např. a.b.c.example.com).

Kvůli těmto problémům není spolehlivé získání základní domény z libovolných hostitelů triviální. Plně korektní řešení vyžaduje znalost veřejného seznamu přípon (všech platných TLD a vícedílných TLD). Bez toho bude jakákoli regexová nebo heuristická metoda křehká.

Pokud je ve vaší aplikaci přesná extrakce domény kritická, použijte dobře udržovanou knihovnu s veřejnou příponovou orientací. V opačném případě může postačit heuristický přístup, ale buďte si vědomi jeho omezení.

Extrakce domény z e-mailové adresy

E-mailové adresy mají jednoduchou strukturu: local-part@domain. Získání části domény v jazyce PHP:

$email = 'user@example.com';
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$domain = explode('@', $email)[1];
echo $domain; // "example.com"
} else {
// invalid email
}

Případně:

$domain = substr(strstr($email, '@'), 1);

Důležité body:

  • Nejprve ověřte formát e-mailu pomocí filter_var(..., FILTER_VALIDATE_EMAIL) před extrakcí.
  • Tato metoda vrací přesně to, co je za @. Pokud je e-mail nestandardní (obsahuje více @nebo další údaje), může být vyžadována další validace nebo sanitace.

Tato metoda je jednoduchá a funguje dobře, pokud důvěřujete zadávání e-mailů nebo je ověřujete.

Upozornění, okrajové případy a osvědčené postupy

  • Odstranění subdomény je náchylné k chybám. Regex nebo naivní rozdělení na "." může selhat u víceúrovňových TLD nebo složitých hostitelů. Pokud záleží na přesnosti, použijte přístup založený na veřejných příponách.
  • Data poskytovaná serverem (zejména HTTP_HOST) pochází ze záhlaví klienta, vyhněte se důvěře v něj, pokud jde o kód kritický z hlediska zabezpečení.
  • Před zpracováním vždy ověřte a upravte externí vstup (adresy URL a e-maily). Před použitím adresy URL se například ujistěte, že má schéma a je správně formulovaná. parse_url().
  • Dávejte pozor na internacionalizované názvy domén (IDN). Operace s prostým řetězcem nebo regexem nemusí zvládnout doménová jména, která nejsou v kódování ASCII; v závislosti na případu použití může být nutné zpracování IDN/Punycode.

Závěr

Jazyk PHP poskytuje účinné integrované nástroje pro extrakci názvů domén v typických případech použití na webu:

  • Použijte $_SERVER['HTTP_HOST'] (s detekcí schématu) pro aktuální doménu požadavku.
  • Použijte parse_url() analyzovat řetězec URL a extrahovat hostitele.
  • Použijte jednoduchou manipulaci s řetězci nebo explode('@') extrahovat doménu z e-mailové adresy.
  • Pro extrakci registrovatelné domény (bez subdomén) se spoléhejte na knihovnu s veřejnou příponovou znalostí, nikoli na naivní řetězcové hacky.

Zatímco jednoduché případy jsou snadné, okrajové případy (subdomény, víceúrovňové domény nejvyšší úrovně, chybný vstup) vyžadují pečlivé zpracování. Chcete-li získat robustní kód připravený k výrobě, ověřujte vstupy a dávejte přednost parsování založenému na knihovně, pokud záleží na správnosti domény.

Původní článek publikoval Nabil Hassen.