2011-12-21 44 views
2

我已經做了一些沒有和解決方案的這個問題的研究。多個域來改變共享主機PHP文件的內容

設置如下:多個域名稱,www.domainA.com和www.domainB.com。 這兩個域都映射到LAMP服務器上的相同宿主文件夾。我希望該文件夾中的index.php文件能夠「知道」哪個域正在訪問這些文件並改變SQL中的內容。即加載特定於該域的不同客戶端ID。

我查看了$_SERVER['REMOTE_HOST']$_SERVER['HTTP_REFERRER']後者已被明確聲明是不可靠的。我在一個足夠強大的解決方案之後。

.htaccess不會做的伎倆(我不會想?)我正在考慮一些沿着域名DNS IP的行列,作爲行動的堅實來源。將不勝感激一些指導。

更新:有一些解決方案建議 - 我想有一個SQL表,其中將包含所有預期的域。 TABLE客戶端('id_client','client_name','client_url')並查詢此表,將'id_client'返回給$變量。

如果$ _SERVER ['HTTP_HOST']與數據庫中的client_url匹配,則返回相應的id_client。 .htaccess解決方案 - 無論多麼優雅 - 都需要不斷更新文件。我寧願儘可能在php和數據庫中保留解決方案。

$ _SERVER ['HTTP_HOST']失敗的情況是什麼?

回答

2

你的確可以用的.htaccess

做到這一點隨着modrewrite重寫domaina.com到index.php?CLIENT_ID =一個

下面的代碼示例,從http://corz.org/serv/tricks/htaccess2.php

#two domains served from one root.. 
RewriteCond %{HTTP_HOST} domain-one.com 
RewriteCond %{REQUEST_URI} !^/one 
RewriteRule ^(.*)$ one/$1 [L] 

RewriteCond %{HTTP_HOST} domain-two.com 
RewriteCond %{REQUEST_URI} !^two 
RewriteRule ^(.*)$ two/$1 [L] 

只需修改正則表達式和路由以適應您的情況。

+0

謝謝托爾!是的,我沒有想到。然而,我沒有提到(抱歉),他們需要隱藏起來。在您的示例中,如果用戶要將index.php?client_id = a更改爲index.php?client_id = b,他們將查看錯誤的站點。這不像我想的那樣健壯。你或其他人是否可以想出其他方法來實現這個目標? – Tom 2011-12-21 02:42:09

+0

@ user1108993 @Andrew這就是mod_rewrite的魔力!重寫是隱藏/內部的。用戶看到'domaina.com',但應用程序看到'?domain = a',或者您選擇重寫它。 – Thor 2011-12-21 02:59:40

0

這可以分兩步完成。首先使用在虛擬主機配置每個域的別名,你可以指出它們,這樣所有的請求,請訪問:

託管文件夾 /controller.php/Domain/requested文件夾/頁

一個虛擬主機文件來實現這對於DOMAINA可能看起來像這樣:

<VirtualHost *:80> 
    ServerName domainA.com 
    DirectoryIndex index.html index.htm index.php 
    DocumentRoot /var/www/ 

    Alias /pages /var/www/pages/control.php/DomainA 
</VirtualHost> 

然後control.php將收到的所有請求,Apache將發送變量$ _ SERVER [「PATH_INFO」]與control.php後一切。例如,如果用戶訪問www.DomainA.com/folder1/pageC.php,則$ _SERVER ['PATH_INFO']將是'/DomainA/folder1/pageC.php'。請注意,有必要將動態頁面分離到自己的文件夾中,以便此解決方案能夠正常工作,否則對靜態內容的請求將通過control.php指向導致問題。如果仔細完成,這個目錄結構將會對用戶隱形。

控制。那麼PHP可能是這樣的PHP頁面:

<?php 
if (isset($_SERVER['PATH_INFO'])) 
{ 
    $path = explode('/', substr($_SERVER['PATH_INFO'], 1)); //substr removes leading slash 
    $domain = array_shift($path); 
    $page = implode('/', $path); //Note: you will want to verify that there is a page name and append 'index.php' if there is not. 
} 

require_once $page; 
?> 
+0

謝謝Ravenex!這聽起來有希望。一個例子將不勝感激 - 迄今爲止,我不太理解你的建議。謝謝你。 – Tom 2011-12-21 02:50:00

+0

我已經添加了一些示例。我們在我們編寫的幾個Facebook應用程序中使用這種解決方案,允許用戶通過單個主控頁面訪問不同的終端,還可以分離開發和生產環境。唯一的限制是分離內容以避免圖像和其他內容通過控制器被引導,但是通過巧妙地使用相同的主體可以避免。 – Ravenex 2011-12-21 03:20:51

+0

這也可用於創建Control-Model-View環境,其中用戶將轉到/ Control/View並且頁面首先加載指定的控件對象以處理所有數據,然後加載該控制器的指定視圖。這允許將用於邏輯的代碼與用於顯示生成的代碼方便地分離。 – Ravenex 2011-12-21 03:25:39

1

如果您正在尋找這樣做在你的代碼最簡單的方法是檢查$_SERVER['HTTP_HOST']返回該用戶使用的是訪問您的網站的主機名。例如,如果我訪問了http://www.exampleA.com/,那麼$_SERVER['HTTP_HOST']將返回www.exampleA.com

然後要執行路由,這是一個簡單的情況,即根據已知主機名列表檢查主機,並根據使用變量的值指定client_id。

使用像Zend Framework這樣的框架可能會稍微容易一些,因爲它已經使用Zend_Controller_Router_Route_Hostname構建了此功能,但您也應該能夠使用獨立PHP相對簡單地實現它。