从PHP检测虚拟主机或localhost/subdr


Detect virtual host or localhost/subdir from PHP?

我正在尝试很多PHP示例项目。对于大多数示例,我需要在Apache配置(httpd-vhosts.conf)中设置一个VirtualHost以使它们正常工作。

但有时我只想复制或测试一个项目,而不需要麻烦地制作另一个VirtualHost。当我尝试http://localhost/ProjectDir/而不是http://ProjectDir/ 时,如果一切都能正常工作,那就太好了

在Phalcon中,我知道如何通过更改配置或使用setBaseUri()来修复根目录,但每次更改都有点不方便。如果这能以某种方式自动完成,那就太好了。(我确实意识到,通过这种方式,我不能在HTML中使用绝对的URL或链接(以/开头),因为这意味着当时Apache服务器的根文件夹,但这可以通过自动配置的前缀变量来解决)。

  • 其他开发人员如何处理这种情况,或者您真的在虚拟主机和http://localhost/ProjectDir/之间做出选择?

  • 有没有一种方法可以让PHP脚本检测它是否在虚拟主机还是本地主机的子目录中?

更新

发现我可以使用$_SERVER['SERVER_NAME']来确定它是"localhost"还是其他什么。不是很优雅,但我想这是一个足够的解决方案。

在html视图中:

为了方便起见,我喜欢使用文档根目录的绝对路径。(相对路径是灵活的,但可能会变得复杂。)

<img src="/images/foo.jpg">

当然,如果我想把项目移到一个子目录中,上面的路径需要调整。(我们可以使用html基本标签,但这可能会产生副作用。):

<img src="/subdir/images/foo.jpg">

我们可以在视图中使用一个变量,将其前缀为链接和资产路径:

<?php
     $base = '/subdir'; // Set somewhere.
?>
<img src="<?php echo $base ?>/images/foo.jpg">

为了自动设置$base变量,我有时会将其分配给Symfony/Component/HttpFoundation/Request::getBasePath()。(该组件中还有一些其他有用的实用程序方法。)或者使用其他框架/库/组件中类似的方法。

在中央配置的一个位置分配一个值并不是什么困难。我发现在视图中预先设置路径更令人痛苦。

在我的一个开发环境中,我使用从目录根到项目目录目录根的符号链接:

/var/www -> /sites/example.com/pub

并在需要时进行交换。您可以避免以这种方式编写多个虚拟主机配置,并跳过上面提到的其他步骤。

然而,可配置前缀在其他方面也很有用:

$base_cdn    = 'http://cdn.example.com';
$base_nav    = '/subdir';
$base_static = '//static.example.com/foo';

假设条目为index.php

function getVirtualHostPath(): string
{
    $temp = str_replace("index.php", "", $_SERVER["SCRIPT_NAME"]);
    return substr($temp, 1);
}
// "https://domain.example/subdir/api/v2/store/inventory" => "subdir/"
// "https://domain.example/api/v2/store/inventory" => "" 
// "https://domain.example/subdir/api/v2/store/inventory" => "subdir/"
// "https://127.0.0.1/api/v2/store/inventory" => ""

说明:

  1. 转储生产中的CCD_ 9 super-global(使用虚拟主机);subdir"
  2. 过滤掉CGI 1.1规范中不存在的所有密钥
  3. 从没有虚拟主机的开发环境中复制相同的密钥
  4. CCD_ 10包含"/subdir/index.php";在prod和"/index.php";在dev.Removing"中;index.php";将返回虚拟主机路径