簡體   English   中英

$ _SERVER ['HTTP_HOST']在本地主機和部署登台服務器上的區別

[英]$_SERVER['HTTP_HOST'] different on localhost versus deployment staging server

從本地主機開發環境部署到暫存服務器后,我們在站點中發現了錯誤。 我們將錯誤縮小到以下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";

這是問題的症結所在:

  • 在我們的本地主機上, $ _SERVER ['HTTP_HOST']解析為' 本地 '-請注意,然后我們需要附加我們的網站文件夾名稱,如上面示例1中所示。 本地計算機上的IE $ _SERVER ['HTTP_HOST'] 不知道涉及哪個網站文件夾-我們必須附加它。

  • 但在我們的登台服務器上, $ _SERVER ['HTTP_HOST']解析為“ www.ourWebSite.com ”。 在這種情況下,我們不需要添加任何內容-登台Web服務器將返回我們的網站文件夾。

我們是否想到過幾個笨拙的“在代碼中評論的旁注”變通辦法。 是。

但是我在想有更好的方法-有什么想法嗎?

一種選擇是擁有一個配置文件,該文件可以根據其所在的主機(通常基於APPLICATION_ENV )正確地進行拉取。 Zend Framework通過在apache配置中加載與APPLICATION_ENV相對應的.ini文件的正確部分來實現此目的。 實際上,您可以將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;
}

怎么樣

function get_homepath(){

   $host = $_SERVER['HTTP_HOST'];
   if ( $host == 'localhost' ){ return $host . '/ourWebSite/'; }

   return $host . '/';

}

通常,人們根據開發環境或生產環境來設置不同的環境設置。 正如您所發現的,這樣做的原因是可以輕松地將代碼從開發轉移到生產。

與其直接在URL中插入$ _SERVER變量,不如設置一個條件來檢查$ _SERVER ['HTTP_HOST'],找出我們所處的環境,然后注入另一個變量來保存腳本的真實路徑。

配置文件是正確的答案。我使用默認設置並覆蓋設置。 在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/相同的文件夾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM