我正在尝试很多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" => ""
说明:
- 转储生产中的CCD_ 9 super-global(使用虚拟主机);subdir"
- 过滤掉CGI 1.1规范中不存在的所有密钥
- 从没有虚拟主机的开发环境中复制相同的密钥
- CCD_ 10包含"/subdir/index.php";在prod和"/index.php";在dev.Removing"中;index.php";将返回虚拟主机路径