获取当前域名

Ton*_*ght 128 php url

我的服务器上有我的网站

http://www.myserver.uk.com
Run Code Online (Sandbox Code Playgroud)

为此,我有两个域:

http://one.com
Run Code Online (Sandbox Code Playgroud)

http://two.com
Run Code Online (Sandbox Code Playgroud)

我想用PHP当前域,但如果我使用$_SERVER['HTTP_HOST']然后这给我看

myserver.uk.com
Run Code Online (Sandbox Code Playgroud)

代替:

one.com or two.com
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得域名,而不是服务器名称?我有PHP版本5.2

one*_*alf 161

试着用这个: $_SERVER['SERVER_NAME']

或解析

$_SERVER['REQUEST_URI']
Run Code Online (Sandbox Code Playgroud)

编辑:

apache_request_headers()

  • -1:仅凭这个答案,我不确切地知道我正在寻找的不同建议.当然,这给了我继续寻找的观点,但这本身并不是一个好的答案...... (19认同)
  • 只是print_r(apache_request_headers()),你会明白所有:) (4认同)
  • @SarahLewis`HTTP_X_ORIGINAL_HOST`可由用户修改,不可信任.这可能并不总是一个问题,但需要注意的是. (2认同)

K. *_*erg 55

最好的用途是

echo $_SERVER['HTTP_HOST'];
Run Code Online (Sandbox Code Playgroud)

并且可以像这样使用

if(strpos( $_SERVER['HTTP_HOST'], 'banana.com') !== false){
    echo "Yes this is indeed the banana.com domain";
}
Run Code Online (Sandbox Code Playgroud)

下面的代码是一个很好的方法,可以在结构化的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();
?>
Run Code Online (Sandbox Code Playgroud)


小智 39

使用$_SERVER['HTTP_HOST']获取我(子域.)maindomain.extension.对我来说似乎是最简单的解决方案.

编辑:如果您实际上是通过iFrame"重定向",则可以添加一个表示域的get参数.

<iframe src="myserver.uk.com?domain=one.com"/>
Run Code Online (Sandbox Code Playgroud)

然后,您可以设置会话变量,以便在整个应用程序中保留此数据.

  • 最重要的是它包括端口号,这样我就不需要事后连接它。bsdnoobz 建议的 phpinfo 帮助我找到了正确的解决方案。 (2认同)

wp-*_*com 12

我不知道这个答案如何在没有提到手头的安全问题的情况下收到了成千上万的观点.

错误的方法:

$_SERVER['HTTP_HOST']
Run Code Online (Sandbox Code Playgroud)

这会从请求标头中获取域,该标头可供黑客操纵,并可能导致缓存中毒.

$_SERVER['SERVER_NAME']
Run Code Online (Sandbox Code Playgroud)

默认的Apache设置已关闭usecanonicalname,填充$_SERVER['SERVER_NAME']的是相同的标头$_SERVER['HTTP_HOST'],无论如何都会使用(加上端口).这是一些恶意的例子.如果启用了usecanonicalname,那么它更安全,但我不知道这种配置是否适用于大多数环境.

注意事项:

  • 如果无法解析serverName,则在其位置使用操作系统的hostname命令[source].
  • Redhat默认启用usecanonical [ source ].
  • 如果省略主机头,则服务器的行为就像在[source]上使用了usecanonical一样.

正确的方法:

唯一有保障的安全方法是将域存储在您可以访问的位置.

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

+----------------------------------------------+------------------------+
| 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'];
Run Code Online (Sandbox Code Playgroud)

(但是如果你在WordPress中构建一个URL,只需使用home_urlsite_url,或任何其他URL函数.)



Sar*_*kar 10

获取域名:

$_SERVER['HTTP_HOST'] 
Run Code Online (Sandbox Code Playgroud)

带有协议的域:

$protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']), 'https') === FALSE ? 'http' : 'https';
$domainLink = $protocol . '://' . $_SERVER['HTTP_HOST'];
Run Code Online (Sandbox Code Playgroud)

协议、域和查询字符串总计:

$url = $protocol . '://' . $_SERVER['HTTP_HOST'] . '?' . $_SERVER['QUERY_STRING'];
Run Code Online (Sandbox Code Playgroud)

**由于 $_SERVER['SERVER_NAME'] 对于多域托管不可靠!


flo*_*ree 8

试试$_SERVER['SERVER_NAME'].提示:创建一个调用该函数的PHP文件,phpinfo()并查看"PHP变量"部分.我们从未想过有一堆有用的变量.