2013-01-02 75 views
0

我有一個使用主域(domain.com)的應用程序,我希望能夠將其他域指向相同的內容,而無需維護單獨的代碼實例。該應用程序包含在主域中的文件夾,該文件夾不被搜索引擎等訪問,所以我不擔心搜索引擎優化等。所有的域將在運行Apache的同一臺服務器上。使用相同內容的多個域

我想確保域名保持原來的狀態,而不是重定向到domain.com,因爲這樣做的目的是讓多個客戶可以使用代碼,但是使用他們的顏色標記給他們的應用程序,標誌等使用來自MySQL數據庫的設置。

例如,用戶轉到newdomain.com,他們看到一個登錄表單,它是存儲在/ home/newdomain/public_html中的本地登錄表單 - 成功登錄時,它們被定向到包含應用程序的/文件夾,而不是導向到newdomain.com/folder這是空的我希望他們被重定向到domain.com/folder(即/ home/domain/public_html /文件夾),但仍然在他們的瀏覽器中看到newdomain.com/folder,因此它是透明的他們。

我試過下面https://stackoverflow.com/a/9521102/1278201使用htaccess,但它改變了URL到domain.com:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

RewriteCond %{HTTP_HOST} !^(www\.)?domain\.com$ [NC] 
RewriteRule^http://www.domain.com/%{REQUEST_URI} [R=301,L] 

我還發現,使用Apache的配置這似乎是更好的選擇,因爲我不關心SEO裏面提到一個職位但我不知道如果我可以用它來只重定向一個文件夾(即不重定向根目錄,只是重定向/文件夾)https://stackoverflow.com/a/3849129/1278201

NameVirtualHost * 

<VirtualHost *> 
ServerName domain.com 
DocumentRoot /home/domain/public_html/folder 
</VirtualHost> 

<VirtualHost *> 
ServerName newdomain.com 
DocumentRoot /home/domain/public_html/folder 
</VirtualHost> 

我還發現帖子指出與會話和SSL證書可能存在的問題https://stackoverflow.com/a/140008/1278201這兩個都在應用程序中使用。我很高興爲每個域安裝一個單獨的SSL證書,但上述任何重定向「中斷」會話都可以嗎?如果有人登錄到newdomain.com/folder,然後轉到domain.com/folder,他們需要再次登錄,但是將domain.com/folder重定向到newdomain.com/folder的事實會影響會話安全性?

達到預期結果的最佳方法是什麼?

+0

這正是['ServerAlias'(http://httpd.apache.org/docs/2.2/mod/core.html#serveralias)指令是什麼。 – DaveRandom

回答

0

虛擬主機配置

上面配置片段簡單地設置了兩個virtualHosts中的Apache。它們中的每一個指向相同的文檔根目錄 - 這是將成爲網站根文件夾的文件夾。沒有重定向。虛擬主機是正確的解決方案。

EDIT1 如果你想一般使用相同的文件對所有虛擬主機,但單例外,你可以在每個虛擬主機

例如使用mod_rewritemod_alias重寫請求domain.com/favicon.ico可以從document_root/specific/domain.com/favicon.ico

SSL證書

除非你的客戶分享使用子域名,你將需要爲每個虛擬主機SSL證書的域讀取。如果他們剛剛獲得子域名,則可以購買一個通配符證書* .yourdomain。COM

問題與幾個領域是,你需要爲每個虛擬主機一個IP爲了使用不同的SSL證書:How can I setup different SSL-Certificates for vhosts on Apache?

會議

您的應用程序將需要檢查的域。 Cookie是爲特定域設置的,但客戶端可以通過操作Cookie將會話「移動」到另一個域。無論如何,我不認爲你想要允許所有域上的所有用戶,所以需要在證書檢查時進行檢查。 此外,您可以保存域到會話和終止會話時域變化

session_start(); 
if (user_authorized_with_credentials_and_domain) { 
    $_SESSION['sess_domain'] = $_SERVER['HTTP_HOST']; 
} 

在以後的請求,你可以比較

if ($_SESSION['sess_domain'] !== $_SERVER['HTTP_HOST']) { 
    session_destroy(); 
    // redirect to login 
} 
+0

那麼我可以使用「ServerName newdomain.com/folder」還是隻能在整個域上使用?即我希望root在本地域和文件夾中顯示內容以顯示domain.com/folder內容 – bhttoan

+0

呃..您是否介意閱讀有關虛擬主機的鏈接? 'ServerName domain.com'會讓所有來自'domain.com'的請求從您指定的文件夾中讀取。這可以是像'/'或'/ i/love/cookies.html'這樣的請求,如果它存在於你的文件夾中的話。 –

+0

這就是我所懷疑的 - 我需要用戶能夠查看從本地域提供的newdomain.com/login.php,並且僅當它們被定向到/文件夾時才使用domain.com/folder。如果我正確地閱讀鏈接,那麼我不能與vhosts做這件事,因爲它是全部或沒有,即newdomain.com/login.php實際上會使用domain.com/login.php,這不是我需要的 – bhttoan

2

您可以使用「P」(代表代理通行證)作爲標誌而不是'R = 301':

RewriteCond %{HTTP_HOST} !^(www\.)?domain\.com$ [NC] 
RewriteRule ^(.*)$ http://www.domain.com/$1 [P,L] 

還要將虛擬主機更改爲單個主機:

NameVirtualHost * 

<VirtualHost *> 
    ServerName domain.com 
    ServerAlias www.domain.com newdomain.com www.newdomain.com 
    DocumentRoot /home/domain/public_html/folder 
</VirtualHost> 
相關問題