$ _SERVER ['HTTP_HOST']在localhost与部署登台服务器上有所不同

时间:2012-03-14 20:32:28

标签: php localhost staging

我们在从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'解决方法。是。

但我认为有更好的方法 - 任何想法?

4 个答案:

答案 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/

相同的文件夹