1

我需要检测用户是否从某个子域访问我的网站。如何检测以下示例并使用 PHP 对其进行标记?我只想检测“abc”是否是子域,仅此而已,但它必须与“abc”之后的各种其他域一起使用。

是的,它们位于“abc”子域中。

不,他们不是。

4

5 回答 5

2

您可以检查$_SERVER变量中的HTTP_HOSTSERVER_NAME 。

<?php
if(strpos($_SERVER['SERVER_NAME'], 'abc.domain.com') !== false) {
    //do something
}
?>
于 2012-11-21T20:22:50.520 回答
2

这将返回子域:

array_shift(explode(".",$_SERVER['HTTP_HOST'])); 
于 2012-11-21T20:23:34.763 回答
1

您可以像这样从$_SERVER超全局中访问主机名:

$domain = $_SERVER['HTTP_HOST']

然后有多种方法可以确定该值是否以 开头abc。最简单的可能就是stripos

if(stripos('abc', $domain) === 0) {
    // you found it
}

请注意,在这里使用===代替==非常重要。如果您使用==并且未在 中找到子字符串$domainstripos则会返回false,其中 with将在您的条件中== 0进行评估。true

于 2012-11-21T20:27:07.277 回答
1
<?php

if( explode( '.', $_SERVER['SERVER_NAME'] )[0] === 'abc' ) {
    //do something
}
?>

这会将服务器名称分解为除以 的部分.,因此它将域名的第一部分与字符串 abc 进行比较。

explode(x,x) [N]只有在 PHP 5.4+(或 5.3+,我记错了)中才有可能。

于 2012-11-21T20:33:13.413 回答
0

您可以配置您的 Web 服务器以将所有子域重定向到单个 PHP 文件,您可以在其中弥补错误或通过header()函数重定向用户,例如...

header('Location: http://domain.com');

此外,因为您确定特定的 PHP 文件是因为子域而被访问的,所以您可以执行类似...

$url = $_SERVER['SERVER_NAME'];
list($subdomain) = explode('.', $url, 2);
$subdomain = trim(strtolower($subdomain));

然后$subdomain以你喜欢的方式使用变量(例如打印它)......

echo $subdomain;

以防万一。对于 Apache 配置,您需要修改VirtualHost以将子域重定向到 PHP 文件进行处理。

<VirtualHost *:80>
ServerAlias *.domain.com
DocumentRoot /website/directory/page.php
</VirtualHost>

笔记

1.) 重新启动 Apache。
2.) Apache 会警告您该目录不存在。这是真的,因为您提供的是文件路径而不是目录路径。但这会起作用。

于 2012-11-21T20:36:33.813 回答