получить сабдомен в php


Drinktea
191

Здравствуйте.

Как можно в php получить сабдомен?

Например есть поддомен вида (во всех вариациях):

sub.domen.com 

https://sub.domen.com

https://www.sub.domen.com

http://sub.domen.com

http://www.sub.domen.com

нужно получить только sub


Drinktea

причем нужно это на своем сайте применить, т.е. получить свой субдомен


SeVlad

Drinktea :

нужно получить только sub

https://www.php.net/manual/ru/reserved.variables.server.php:

$_SERVER[‘SERVER_NAME’];

и далее регулярками

PHP: $_SERVER — Manual

  • www.php.net
Вы можете найти (а можете и не найти) любой из следующих элементов в массиве $_SERVER . Обратите внимание, что немногие элементы, если они есть, будут доступны (или даже будут иметь какое-нибудь значение), если PHP запущен в командной строке. ‘ PHP_SELF ‘ Имя файла скрипта, который сейчас выполняется, относительно корня документов. Например…


silicoid

как дети малые. чесслово

echo explode(‘.’, parse_url ( ‘https://my.site.com’,  PHP_URL_HOST ))[0]

это без www
с www добавляете проверку на www


silicoid

апд.
если решать задачу «в лоб» а не красиво, то будет что-то подобное.
приведение к нижнему регистру сделано для того, что parse_url работает как есть. То-есть вываливает имя в том виде, в каком его получает на входе, независимо от регистра.

        $first_sub = explode('.', parse_url ( 'https://WwW.mySubDomain.mYsITe.COM',  PHP_URL_HOST ));
        if (strtolower ($first_sub[0]) == 'www'){
                $subdomain = strtolower ( $first_sub[1] );
        } else {
                $subdomain = strtolower ( $first_sub[0] );
        }
        echo $subdomain;


Х.З.

silicoid #:

как дети малые. чесслово

echo explode(‘.’, parse_url ( ‘https://my.site.com’,  PHP_URL_HOST ))[0]

это без www
с www добавляете проверку на www

а чем не угодил $_SERVER[‘HTTP_HOST’] ? 


silicoid

тем, что это способ разбить путь на составляющие, а не получить его

какую переменную вы туда вкорячите зависит от вашего воображения.
только в той переменной должен быть валидный http адрес, иначе вернет пустую строку

апд.
разумеется, если в качестве источника мы берем $_SERVER, то проще использовать ‘HTTP_HOST’
но это может быть не всегда. например, если url вводится руками пользователя в форме

зы2.

прошу прощения за кучу правок.
Самочувствие не очень, сижу на колёсах.


SeVlad

silicoid #:
тем, что это способ разбить путь на составляющие, а не получить его

какую переменную вы туда вкорячите зависит от вашего воображения.
..
Самочувствие не очень, сижу на колёсах.

Ты эта.. не пиши на колёсах. А то такая ерунда получается…


Евгений Крупченко

мда…

всем неуд.

1) читаем внимательно что спрашивается!

надо именно извлечь sub из всех возможных вариантов, а не просто получить SERVER_NAME.

да и SERVER_NAME не совсем верно использовать.

для примера в nginx конфиге пусть будет:

server_name domen.com www. domen.com sub.domen.com;

но переменная $_SERVER[‘SERVER_NAME’] будет всегда равна domen.com даже если мы зайдем на www. domen.com или sub.domen.com

правильней брать имя домена из HTTP_HOST

но кто вообще говорил что скрипт будет запускаться из под каждого из этих поддоменов, а не просто списком откуда-то браться?

2) parse_url() «споткнется» если на входе будет sub.domen.com, а не http://sub.domen.com

т.е. это уже не все варианты как спрашивалось изначально.

при решении исходим из:

а) если имя основного домена нам не дано, то однозначно определить что считать поддоменом невозможно. будут различные трактовки. потому принимаем, что domen.com нам известно и используем его для вычленения поддомена.

б) не сказано сколько уровней поддоменов может быть. только sub.domen.com или sub.sub.domen.com тоже возможны. примем что такое тоже может быть (вариант с explode ‘.’ и выбор [0] или [1] уже не катит).

решение (одно из):

пусть задано имя основного домена как-то так:

$d='domen.com';

самое простое что можно сделать — найти это имя домена в строке $s (предположительно исключаем ситуацию когда domen.com в строке вообще не будет) и дальше работаем с тем что слева от него.

$s=strstr($s,$d,true);

получаем все что слева от domen.com

дальше идея в том чтоб справа налево дойти www. или / (конец http:// или https://) или до конца строки.

разворачиваем строку задом наперед:

$s=strrev($s);

и таким же поиском strstr находим www. (верней уже .www)

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

$s="$s.www";
$s=strstr($s,'.www',true);

и в случае если www. было, то отрежется оно вместе с нашим добавленным, а если не было, то только наша вставка откусится.

аналогично делаем для слэша:

$s="$s/";
$s=strstr($s,'/',true);

возвращаем правильный порядок символов:

$s=strrev($s);

и напоследок обрезаем точку в конце (разделяющую sub и domen.com):

$s=substr($s,0,-1);

итого:

получить сабдомен в php

проверяем:

получить сабдомен в php


SeVlad

Евгений Крупченко #:
но переменная $_SERVER[‘SERVER_NAME’] будет всегда равна domen.com даже если мы зайдем на www. domen.com или sub.domen.com

Далеко не всегда.

получить сабдомен в php

Но согласен, с SERVER_NAME не всё однозначно.

С HTTP_HOST, впрочем, тоже могут быть нюансы. Но это всё легко выясняется.

Хинт: можно даже заюзать $_SERVER[‘SERVER_ADMIN’], если мыло админа настроена на этот домен ;).


Евгений Крупченко #:
но кто вообще говорил что скрипт будет запускаться из под каждого из этих поддоменов, а не просто списком откуда-то браться?

ТС:

Drinktea #:
причем нужно это на своем сайте применить, т.е. получить свой субдомен


Евгений Крупченко

SERVER_NAME это имя вирт. хоста, но этот вирт. хост может откликаться на разные домены/поддомены.

и у всех этих вариантов (в рамках этого вирт. хоста) SERVER_NAME будет одна и та же, а HTTP_HOST могут отличаться. например с www. и без такового.

а SERVER_ADMIN  вообще вполне может быть не задано.

короче самое надежное это HTTP_HOST — это то, что браузер шлет в заголовке Host: запрашивая сайт этот.

в любом случае задача так понял была надежно вырезать именно sub из всевозможных написаний поддомена. все остальное вторично.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *