我们在从localhost开发环境部署到登台服务器后发现了我们网站中的错误。 我们将错误缩小到以下PHP代码片段:
$_SERVER['HTTP_HOST']
我们使用它来构建我们网站使用的各种文件的路径。
例如:
// EXAMPLE #1 -- THIS WORKS ON OUR LOCAL MACHINE
$theSelectedImage = "http://" . $_SERVER['HTTP_HOST'] . "/ourWebSite/egyptVase.png";
// EXAMPLE #2 --BUT IT MUST BE THIS TO WORK ON THE STAGING SERVER
$theSelectedImage = "http://" . $_SERVER['HTTP_HOST'] . "/egyptVase.png";
以下是问题的症结所在:
在我们的localhost机器上, $ _ SERVER ['HTTP_HOST'] 解析为' localhost ' - 请注意我们需要将我们的网站文件夹名称添加为我在上面的例子#1中显示。 I.E.在我们的localhost机器上,$ _SERVER ['HTTP_HOST']是 unaware 涉及哪个网站文件夹 - 我们必须附加它。
但在我们的登台服务器上, $ _ SERVER ['HTTP_HOST'] 解析为“ www.ourWebSite.com ”。 在这种情况下,我们不需要附加任何内容 - 登台Web服务器返回我们的网站文件夹。
我们是否考虑过几个kludgy不优雅的'snide-remarks-in-code-reviews'解决方法。是。
但我认为有更好的方法 - 任何想法?
答案 0 :(得分:4)
一个选项是让配置文件根据其所在的主机(通常基于APPLICATION_ENV
)正确拉取。 Zend Framework通过在apache配置中加载与.ini
对应的APPLICATION_ENV
文件的正确部分来完成此操作。你可以使用带有数组或其他任何东西的PHP文件。您需要做的就是将APPLICATION_ENV
设置为暂存/生产的一件事,但在开发服务器上有所不同。
一个简单的例子:
switch (APPLICATION_ENV) {
case 'dev':
define('APPLICATION_URL', $_SERVER['HTTP_HOST'] . '/ourWebSite');
break;
case 'production':
case 'staging':
define('APPLICATION_URL', $_SERVER['HTTP_HOST']);
break;
}
答案 1 :(得分:3)
怎么样
function get_homepath(){
$host = $_SERVER['HTTP_HOST'];
if ( $host == 'localhost' ){ return $host . '/ourWebSite/'; }
return $host . '/';
}
答案 2 :(得分:3)
通常人们根据其开发环境或生产环境设置不同的环境设置。正如您所发现的,其原因是可以轻松地将代码从开发转移到生产。
不是直接在URL中插入$ _SERVER变量,而是设置一个条件来检查$ _SERVER ['HTTP_HOST'],找出我们的环境,并注入一个不同的变量来保存脚本的真实路径。
答案 3 :(得分:3)
配置文件是正确的答案..我使用默认和覆盖设置。 在config.php中
$config = array('url' => 'http://production.url'); // 'conf1'=> 'var1', etc
$dev_config = array();
@include_once('dev-config.php');
$config = array_merge($config, $dev_config);
在dev-config.php中,您可以向$ dev_config
添加任何覆盖$dev_config['url'] = 'http://localhost/ourWebSite';
然后在生产中,我只删除了dev-config文件。超级简单,完美无瑕。
如果你想保持它的方式,这也可以通过你的开发盒上的http.conf调整来解决。您需要将documentRoot设置为现在的版本加上/ ourWebSite,http://localhost/将指向您的代码中与http://production.url/
相同的文件夹