我需要检测用户是否从某个子域访问我的网站。如何检测以下示例并使用 PHP 对其进行标记?我只想检测“abc”是否是子域,仅此而已,但它必须与“abc”之后的各种其他域一起使用。
是的,它们位于“abc”子域中。
- http://domain.com/
- http://xyz.domain.com/
- http://www.domain/
- http://sub.domain.com/
- http://xyz.sub.domain.com/
不,他们不是。
我需要检测用户是否从某个子域访问我的网站。如何检测以下示例并使用 PHP 对其进行标记?我只想检测“abc”是否是子域,仅此而已,但它必须与“abc”之后的各种其他域一起使用。
是的,它们位于“abc”子域中。
不,他们不是。
您可以检查$_SERVER变量中的HTTP_HOST或SERVER_NAME 。
<?php
if(strpos($_SERVER['SERVER_NAME'], 'abc.domain.com') !== false) {
//do something
}
?>
这将返回子域:
array_shift(explode(".",$_SERVER['HTTP_HOST']));
您可以像这样从$_SERVER
超全局中访问主机名:
$domain = $_SERVER['HTTP_HOST']
然后有多种方法可以确定该值是否以 开头abc
。最简单的可能就是stripos
if(stripos('abc', $domain) === 0) {
// you found it
}
请注意,在这里使用===
代替==
非常重要。如果您使用==
并且未在 中找到子字符串$domain
,stripos
则会返回false
,其中 with将在您的条件中== 0
进行评估。true
<?php
if( explode( '.', $_SERVER['SERVER_NAME'] )[0] === 'abc' ) {
//do something
}
?>
这会将服务器名称分解为除以 的部分.
,因此它将域名的第一部分与字符串 abc 进行比较。
explode(x,x) [N]只有在 PHP 5.4+(或 5.3+,我记错了)中才有可能。
您可以配置您的 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 会警告您该目录不存在。这是真的,因为您提供的是文件路径而不是目录路径。但这会起作用。