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

12
D
На сайте с 01.01.2016
Offline
43
524

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

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

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

sub.domen.com 

https://sub.domen.com

https://www.sub.domen.com

http://sub.domen.com

http://www.sub.domen.com

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


Пусто...
D
На сайте с 01.01.2016
Offline
43
#1
причем нужно это на своем сайте применить, т.е. получить свой субдомен
SeVlad
На сайте с 03.11.2008
Offline
1609
#2

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 ' Имя файла скрипта, который сейчас выполняется, относительно корня документов. Например...
Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
S
На сайте с 13.10.2014
Offline
171
#3

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

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

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

S
На сайте с 13.10.2014
Offline
171
#4
апд.
если решать задачу "в лоб" а не красиво, то будет что-то подобное.
приведение к нижнему регистру сделано для того, что 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;

ХЗ
На сайте с 31.08.2008
Offline
155
#5
silicoid #:

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

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

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

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

S
На сайте с 13.10.2014
Offline
171
#6
тем, что это способ разбить путь на составляющие, а не получить его

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

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


зы2.

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

SeVlad
На сайте с 03.11.2008
Offline
1609
#7
silicoid #:
тем, что это способ разбить путь на составляющие, а не получить его

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

Ты эта.. не пиши на колёсах. А то такая ерунда получается...
Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#8

мда...

всем неуд.

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);

итого:


проверяем:


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

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



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

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


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


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

ТС:

Drinktea #:
причем нужно это на своем сайте применить, т.е. получить свой субдомен
Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#10

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

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

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

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


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

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий