2011-07-05 77 views
0

情況:我有一個單獨的(主)域,它有幾個別名域,每個別名都指向相同的基於Plesk的服務器(例如,我的主域名爲example.com,與something.net,anotherone.co.uk和其他幾個全部作爲主域帳戶的別名)。這意味着,無論何時將域名輸入到任何別名的地址欄中,它都會直接轉到主域的帳戶(example.com)。爲域別名重寫規則

問題:基於別名(ES)的域名,我有一個index.php每個域不同的重定向(例如,請求對域A重定向到一個企業網站,域B都到了感謝網站等等)。這很好用,但是如果一個目錄被添加到域名後面(即somealias.com/something),那麼它會給出404 not found錯誤。

我真的很感激,如果有人能夠幫助我,那麼這是一個(單一的,如果可能的話)重寫規則集,它將剝離掉所有的尾隨目錄和/或GET請求,並且只留下輸入的基本URL,那麼坐在主域文檔根目錄下的php腳本可以適當地接管並處理請求。

奇怪的是,我一直無法找到這個(簡單)解決方案。是否必須爲每個別名域分別定義規則?

回答

0
RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_URI} !=/ 
RewriteCond %{REQUEST_URI} !=/index.php 
RewriteRule .* http://%{HTTP_HOST}/? [L] 

這將需要除了根文件夾中所有請求/(如http://example.com/)或索引文件(如http://example.com/index.php),並將其重定向到根目錄(例如http://example.com/some-url將被重定向到http://example.com/)。

您可能需要由被得到執行,當你打的根文件夾(Apache會默默地改寫http://example.com/http://example.com/index.php文件(根據您的實際設置),因爲它需要有一個文件,否則執行它可以取代index.php顯示錯誤)。


或者(甚至可能更好 - 取決於你的實際設置和要求),你可以使用這些規則 - 這將僅重定向不存在的網址。所以,如果你有你的網站上的圖片meow.png,這些規則將允許您訪問它(http://example.com/meow.png):

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* http://%{HTTP_HOST}/? [L] 

UPDATE: 如果你要去的地方到這個配置文件(httpd- vhost.conf或httpd.conf文件),然後使用這些規則:

RewriteEngine On 

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d 
RewriteCond %{REQUEST_URI} !=/index.php 
RewriteRule .* http://%{HTTP_HOST}/? [L] 
+0

嗨;非常感謝您的回答!我嘗試了兩種選擇;不幸的是,因爲這些規則必須進入主域頂級vhost配置文件(如根級htaccess),所以我不能使用RewriteBase(它只能用作Directory指令)。這兩個例子雖然很接近,但通過將index.php附加到前一個重定向的URI字符串的末尾,將瀏覽器發送到無限循環。但是,它給了我更多的彈藥 - 再次感謝! – WalB

+0

1)你用'.htaccess'標籤標記了你的問題 - 如果你不打算在.htaccess中放置規則,你爲什麼使用它? 2)是的,RewriteBase不能用於配置文件 - 僅用於Directory或.htaccess 3)是的,如果將它們放置在配置文件中,您將需要修改這些規則。 – LazyOne

+0

@ User829303使用可以放置在** httpd.conf **或其他配置文件中的規則更新了我的答案。 – LazyOne

0

嘗試以下,

#Options +FollowSymLinks 
RewriteEngine on 
RewriteCond %{HTTP_HOST} ^www.olddomain.com$[OR] 
RewriteCond %{HTTP_HOST} ^olddomain.com$ 
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L] 
+0

感謝您的回答;但是,爲每個別名域設置一條規則是我想盡量避免的(我現在有15個別名,更有可能被添加)。我想要的是以某種方式定義一個規則集,以便它可以獲取地址欄中輸入的任何基本URL(服務器名稱)(例如,如果請求是** example.co.uk/somedir **我想要它將轉到** example.com ** - 類似地,如果輸入的服務器名稱是** anotheralias.com/anotherdir **我希望它動態地轉到** anotheralias.com **)。希望澄清問題。 – WalB

0

在我看來,所有的網站都在同一臺服務器上託管(可能使用相同的代碼庫)。 如果您的index.php是一個前端控制器,您可以將所有內容重定向到index.php,並在index.php的第一行決定加載哪個前端控制器(如backend.php)。
如果您不介意必須維護別名列表,您可以定義[別名] =>路徑到前端控制器的哈希。
在您主域的前端控制器中,您檢查別名(例如,使用$ _SERVER ['SERVER_NAME']),並加載相應的文件。
每次添加新別名時,您都必須添加並輸入散列。如果它們不是動態生成的,那麼這個散列並不是很麻煩。