[英]$_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.