这个$_SERVER[\'HTTP_HOST\']
global通常包含当前请求发送到的域/子域,但有一些注意事项。在web请求的上下文中,该变量由web服务器和代理自行设置,Apache/Nginx可能不会根据其配置传递该标头,也可能用其他值(如代理的主机)替换它。它也没有包含在HTTP1.0请求中(尽管HTTP 1.0客户端越来越少),而且有人担心,由于它是从客户端发送的数据派生出来的,因此它可能包含不需要的或任意的值。
某些环境也将填充$_SERVER[\'SERVER_NAME\']
.
在WordPress API中,多站点网络中存在一个检索域的函数,其形式为get_clean_basedomain()
. 但是,在多站点安装之外,此功能不可用。但我们可以从它的实现中获得线索,并创建类似的内容,将主机解析出配置的站点URL(无论是域名、IP地址还是主机名):
/**
* Retrieves the current site\'s host domain, IP address, or hostname.
*
* @return string The site\'s host.
**/
function wpse377481_get_site_host() {
if( function_exists( \'get_clean_basedomain\' ) )
return get_clean_basedomain();
return parse_url( get_site_url(), PHP_URL_HOST );
}
无论您如何获得主机字符串,TLD都可以被视为最后一个字符串的子字符串
.
:
/**
* Retrieves the TLD for a given host string.
*
* @param string|null $host A host string. Defaults to the current site\'s host.
* @return string|false The TLD, or `false` if not applicable.
**/
function wpse377481_get_tld( $host = null ) {
if( $host === null )
$host = wpse377481_get_site_host();
if( rest_is_ip_address( $host ) )
return false; // An IP address has no TLD.
if( strpos( $host, \'.\' ) === false )
return false; // An isolated host name has no TLD.
return substr( $host, strrpos( $host, \'.\' ) + 1 );
}
虽然这很容易产生实际上不属于根区域的TLD(更不用说无效IPv4地址的最后八位字节),但我认为这种行为是可取的。许多人使用不存在的
.test
例如,当地开发的TLD。或具有内部DNS服务器的公司内部网,这些服务器利用自定义TLD。