如何获取网站的根 URL?

新手上路,请多包涵

可能是一个微不足道的问题,但我正在寻找一种方法来获取站点 url 的根,例如: http://localhost/some/folder/containing/something/here/or/there 应该返回 http://localhost/

我知道有 $_SERVER['DOCUMENT_ROOT'] 但这不是我想要的。

我确信这很容易,但我一直在阅读: 这篇文章 试图找出我应该使用或调用什么。

想法?

我的另一个问题与这个问题有关 - 答案是什么,在 http://subsite.localhost/some/folder/containing/something/here/or/there 这样的网站上工作,所以我的最终结果是 http://subsite.localhost/

原文由 Adam 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 716
2 个回答
$root = (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . '/';

如果您对当前脚本的方案和主机感兴趣。根据 Web 服务器配置(反向代理、重写),“当前”可能不是您在浏览器中看到的,但它是 PHP 认为它正在处理的。

否则,如果你手头有一个 URL,你想要 parse_url() 的根,正如已经建议的那样。例如

$parsedUrl = parse_url('http://localhost/some/folder/containing/something/here/or/there');
$root = $parsedUrl['scheme'] . '://' . $parsedUrl['host'] . '/';

如果您还对路径之前的其他 URL 组件(例如凭据)感兴趣,您还可以在完整 URL 上使用 substr(),将“路径”的开头作为停止位置,例如

$url = 'http://user:pass@localhost:80/some/folder/containing/something/here/or/there';

$parsedUrl = parse_url($url);
$root = substr($url, 0, strpos($url, $parsedUrl['path'], strlen($parsedUrl['scheme'] . '://'))) . '/';//gives 'http://user:pass@localhost:80/'

注意:strpos() 中的偏移量用于处理 URL 可能已经是根的情况。

原文由 boen_robot 发布,翻译遵循 CC BY-SA 4.0 许可协议

You can using Define save on define.php include for next time use on other project This is PROTOCOL DOMAIN PORT SITE_ROOTSITE PATH

 **
 * domain
 * ex: localhost, maskphp.com, demo.maskphp.com,...
 */
define('DOMAIN', isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']);

/**
 * protocol
 * ex: http, https,...
 */
define('PROTOCOL', isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] === 1)
    || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ? 'https' : 'http');

/**
 * port
 * ex: 80, 8080,...
 */
define('PORT', $_SERVER['SERVER_PORT']);

/**
 * site path
 * ex: http://localhost/maskphp/ -> /maskphp/
 */
define('SITE_PATH', preg_replace('/index.php$/i', '', $_SERVER['PHP_SELF']));

/**
 * site root
 * ex: http://maskgroup.com, http://localhost/maskphp/,...
 */
define('SITE_ROOT', PROTOCOL . '://' . DOMAIN . (PORT === '80' ? '' : ':' . PORT) . SITE_PATH);

您可以调试以查看结果

原文由 Dinh Phong 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题