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, pokudHTTP_HOSTnení 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.