如何检索当前网站的TLD域?

时间:2020-11-01 作者:Jesse Nickles

WordPress有一些变量,如site_urlhome_url 以及插件、主题、上传等的路径。。。但似乎没有简单的方法来显示当前的TLD域。

这可能需要使用PHPpreg_replace 或者类似的东西,但我不确定生成此代码段的最干净或最可靠的方法是什么?

例如,对于安装到URL的WP站点,如https://www.example.co.uk 如何仅检测TLD(例如,将其另存为变量以便在PHP脚本中使用)。。。它要么需要了解各种不同的TLD,要么至少可以为不同的TLD类型定制?

1 个回复
SO网友:bosco

这个$_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。

相关推荐

无法访问wp-admin,重定向到http://%24domain/wp-admin/

我在Digital Ocean VPS上有一个WordPress网站,我回来后试图通过“wp admin”链接登录到管理面板。由于某种原因,我现在无法访问它。网站被重定向到\'http://%24domain/wp-admin/\' 这是一个断开的链接。以下是我目前尝试过的东西,但迄今为止没有任何效果:重命名插件目录,使其显示为停用状态将以下两行添加到wp config。php:define(\'WP\\u SITEURL\',\'http://example.com\');定义(\'WP\\U HOME