获取当前域名

时间:2012-05-23 09:36:30

标签: php url

我的服务器上有我的网站

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

10 个答案:

答案 0 :(得分:151)

尝试使用此:$_SERVER['SERVER_NAME']

或解析

$_SERVER['REQUEST_URI']

修改

  

apache_request_headers()

答案 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,那么它更安全,但我不知道这种配置是否适用于大多数环境。

注意事项:

  • 如果无法解析serverName,则在其[source]处使用操作系统的hostname命令。
  • 默认情况下,Redhat会启用usecanonical [source]。
  • 如果省略主机标头,服务器将表现得像usecanonical 在[source]上。

正确的方法

  

唯一有保障的安全方法是将域名存储在您有权访问的位置。

许多框架已经为您完成此操作,因此请参阅特定框架的文档。如果您没有使用框架,则以下任何方法都可以使用:

+----------------------------------------------+------------------------+
| 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用户

如果您使用的是WordPress,则可以安全地获取域名:

$urlparts = parse_url(home_url());
$domain = $urlparts['host'];

(但如果您在WordPress中构建网址,只需使用home_urlsite_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];