我的服务器上有我的网站
http://www.myserver.uk.com
为此,我有两个域名:
http://one.com
和
http://two.com
我想使用PHP当前域名,但如果我使用$_SERVER['HTTP_HOST']
,那么这会告诉我
myserver.uk.com
而不是:
one.com or two.com
我如何获得域名,而不是服务器名称?我有PHP版本5.2
答案 0 :(得分:151)
答案 1 :(得分:48)
最好的用途是
echo $_SERVER['HTTP_HOST'];
可以像这样使用
if(strpos( $_SERVER['HTTP_HOST'], 'banana.com') !== false){
echo "Yes this is indeed the banana.com domain";
}
以下代码是一种很好的方法,可以在结构化HTML输出中查看$ _SERVER中的所有变量,并突出显示关键字,并在执行后直接停止。因为我有时会忘记自己使用哪一个 - 我认为这可以很漂亮。
<?php
// change banana.com to the domain you were looking for..
$wordToHighlight= "banana.com";
$serverVarHighlighted = str_replace( $wordToHighlight, '<span style=\'background-color:#883399; color: #FFFFFF;\'>'. $wordToHighlight .'</span>', $_SERVER );
echo "<pre>";
print_r( $serverVarHighlighted );
echo "</pre>";
exit();
?>
答案 2 :(得分:39)
使用$_SERVER['HTTP_HOST']
获取me(subdomain。)maindomain.extension。对我来说似乎是最简单的解决方案。
编辑:如果您实际上是通过iFrame'重定向',则可以添加一个说明域的get参数。
<iframe src="myserver.uk.com?domain=one.com"/>
然后你可以设置一个会话变量,在整个应用程序中保存这些数据。
答案 3 :(得分:9)
我不知道这个答案如何在没有提到手头的安全问题的情况下收到数十万个观点。
$_SERVER['HTTP_HOST']
这会从请求标头中获取域open to manipulation by hackers,并且可能导致缓存中毒。
$_SERVER['SERVER_NAME']
默认的Apache设置已关闭usecanonicalname,其中$_SERVER['SERVER_NAME']
填充了相同的标题$_SERVER['HTTP_HOST']
,无论如何都会使用(加上端口)。 Here are some malicious examples。如果启用了usecanonicalname,那么它更安全,但我不知道这种配置是否适用于大多数环境。
注意事项:
唯一有保障的安全方法是将域名存储在您有权访问的位置。
许多框架已经为您完成此操作,因此请参阅特定框架的文档。如果您没有使用框架,则以下任何方法都可以使用:
+----------------------------------------------+------------------------+ | Secure Methods of Storing The Current Domain | Default/Recommended In | +----------------------------------------------+------------------------+ | Config file | Joomla, Drupal/Symfony | | Database | WordPress | | Environmental variable | Laravel | | Service registry | Kubernetes DNS | +----------------------------------------------+------------------------+
如果您使用的是WordPress,则可以安全地获取域名:
$urlparts = parse_url(home_url());
$domain = $urlparts['host'];
(但如果您在WordPress中构建网址,只需使用home_url或site_url或任何other URL functions。)
答案 4 :(得分:6)
试试$_SERVER['SERVER_NAME']
。
提示:创建一个调用函数phpinfo()
的PHP文件,并查看“PHP变量”部分。我们从未想过有一堆有用的变量。
答案 5 :(得分:4)
迟到的答案,但在这里:
$currentDomain = preg_replace('/www\./i', '', $_SERVER['SERVER_NAME']);
它会为您提供一个干净的域名,而不是www
答案 6 :(得分:3)
我知道这可能不完全是关于这个问题,但根据我的经验,我发现将当前URL的WWW-ness存储在一个有用的变量中。
修改:此外,请参阅下面的评论,了解相关内容。
在确定是否使用“www”或不使用
调度Ajax调用时,这很重要$.ajax("url" : "www.site.com/script.php", ...
$.ajax("url" : "site.com/script.php", ...
调度Ajax调用时,域名必须与浏览器地址栏中的域名相匹配,否则您将在控制台中显示 Uncaught SecurityError 。
所以我想出了解决这个问题的解决方案:
<?php
substr($_SERVER['SERVER_NAME'], 0, 3) == "www" ? $WWW = true : $WWW = false;
if ($WWW) {
/* We have www.example.com */
} else {
/* We have example.com */
}
?>
然后,根据$ WWW是否为true,或者false运行正确的Ajax调用。
我知道这可能听起来微不足道,但这是一个容易绊倒的常见问题。
答案 7 :(得分:1)
对不起,对于最新答案,每个人都在使用parse_url
函数,但有时用户可能以不同的格式传递该筹码
为了修复我创建的功能,请检查
function fixDomainName($url='')
{
$strToLower = strtolower(trim($url));
$httpPregReplace = preg_replace('/^http:\/\//i', '', $strToLower);
$httpsPregReplace = preg_replace('/^https:\/\//i', '', $httpPregReplace);
$wwwPregReplace = preg_replace('/^www\./i', '', $httpsPregReplace);
$explodeToArray = explode('/', $wwwPregReplace);
$finalDomainName = trim($explodeToArray[0]);
return $finalDomainName;
}
只需传递网址并获取域 例如
echo fixDomainName('https://stackoverflow.com');
将返回结果为
stackoverflow.com
在某些情况下
echo fixDomainName('stackoverflow.com/questions/id/slug');
,它还会返回stackoverflow.com
希望有帮助
答案 8 :(得分:1)
$_SERVER['HTTP_HOST']
//获取域
$protocol=strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === FALSE ? 'http' : 'https';
$domainLink=$protocol.'://'.$_SERVER['HTTP_HOST'];
//具有协议的域
$url=$protocol.'://'.$_SERVER['HTTP_HOST'].'?'.$_SERVER['QUERY_STRING'];
//协议,域,queryString总计 **由于$ _SERVER ['SERVER_NAME']对于多域托管不可靠!
答案 9 :(得分:-1)
只需尝试:
echo apache_request_headers()[3];