尝试使用PHP获取子域名的URL

4

实际上,我正在尝试使用PHP获取子域名URL。我编写了以下代码:

$sub_url = explode('.', $_SERVER['HTTP_HOST']);
$suburl = $sub_url[0];

例如: 如果子域名URL为my.example.com 上述代码会给出my,这很好,但如果没有子域名,则我的代码将返回example,这不好。
我想要的是第一个点之前的任何内容,甚至包括www,但如果没有任何内容,例如URL为example.com,则我希望返回一个空值而不是example

2
如果(count($sub_url)>2),请注意,“one.two.three.domain.com”也可能出现。 - Devon
非常好的建议,我已经按照你说的方法做了。 - GamesPlay
3个回答

14

这里有一个获取子域名的一行代码:

$subdomain = join('.', explode('.', $_SERVER['HTTP_HOST'], -2))

explode函数使用-2作为参数时,会将字符串以每个句点分割,忽略最后两个元素。如果有两个或更少的元素,则返回一个空数组。

join函数会将生成的数组组装成一个用句点分隔的字符串。如果您设置了多个子域名,例如foo.bar.domain.com,则返回foo.bar

如果没有子域名,则返回空字符串。


如果我将参数更改为1,它对我起作用。 - Mostafa

1
我会假设您可以检查数组的大小,假设它始终是相同的大小,如果它比任何更大,您可能会遇到问题。
$sub_url = explode('.', $_SERVER['HTTP_HOST']);

if (sizeof($sub_url) > 2) {
    $suburl = $sub_url[0];
} else {
    $suburl = null;
}

0

你应该注意到,有些网站使用二级域名,例如co.ukcom.cn。如果你能确保你的代码不会在这样的网站上使用,你可以简单地使用DarthJDG的答案或检查count($sub_url) > 2。但如果不是这样,你需要检查域名。

$secondLevelDomainsList = str_getcsv(file_get_contents('https://raw.github.com/gavingmiller/second-level-domains/master/SLDs.csv'), PHP_EOL);
foreach($secondLevelDomainsList as &$item) {
    list($tld, $stld) = str_getcsv($item, ",");
    $item = $stld;
}    
$urlParts = explode('.', $url);    
$challenger = '.' . join('.', array_slice($urlParts, -2, 2, true));    
$length = in_array($challenger, $secondLevelDomainsList) ? -3 : -2;    
$subDomainName = join('.', array_slice($urlParts, 0, $length, true));

测试使用 gavingmiller/second-level-domains Github 仓库中以 CSV 格式列出的二级域名列表,以判断该域名是否为二级域名。


使用任何类似的列表都会带来两个问题:如果由于任何原因无法访问它,会发生什么,以及如何确保它是最新的(最后一次提交是4年前)。这里有另一个更为更新的列表,因为所有浏览器都在使用它:https://publicsuffix.org/list/public_suffix_list.dat(阅读https://publicsuffix.org/了解其是什么以及如何使用)。 - Patrick Mevzek
1
是的,会出现这样的问题。但对于第一个问题,可以使用本地副本或缓存。对于第二个问题,代码中的git仓库只是一个简单的例子,我的目的是提醒大家,也应该考虑第二级域名。 - swy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接