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