2013-05-10 58 views
3

我試圖將舊域重定向到新的子域,同時嘗試在瀏覽器的地址欄中顯示舊域。如何將舊域名重定向到新域名,同時在瀏覽器的地址欄中保留舊域名?

我用htaccess來做到這一點,一切工作,除了保持舊的域在地址欄中可見。

另一件很重要的事情就是需要維護url和GET變量中的文件夾。

我想通過htaccess優雅地完成所有這些工作,因爲我不想使用i-frame來實現這一點。

這是我迄今爲止使用的代碼。它的工作原理除了在瀏覽器的地址欄中保留舊的域名。

我的問題是,如何在重定向後在瀏覽器的地址欄中顯示舊域名?我在某處讀到,這可以通過所謂的「代理內容」來完成,但我可能是錯的。我也不知道這是如何工作的。

<IfModule mod_rewrite.c> 

RewriteEngine On 

RewriteBase/

RewriteCond %{HTTP_HOST} ^domain.com [nc] 
RewriteRule ^(.*)$ http://subdomain.domain.com/$1 [r=301,nc,L] 

RewriteCond %{HTTP_HOST} ^www.domain.com [nc] 
RewriteRule ^(.*)$ http://subdomain.domain.com/$1 [r=301,nc,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 

</IfModule> 

更新

好了,所以我得到了一步。當我將網站文件放入根目錄的子目錄中時,下面的代碼有效。

但是,它仍然存在問題。雖然它將example.com重定向到example.com/subdirectory,但並未將example.com/index.php重定向到example.com/subdirectory/index.php。

我仍然試圖找出如何做到這一點,以便它可以處理所有文件,包括index.php。

#Redirect a domain to a subdirectory, while displaying only the domain and not the subdirectory in the browser address bar. 
<IfModule mod_rewrite.c> 

Options +FollowSymLinks 

RewriteEngine On 

RewriteBase/

RewriteCond %{HTTP_HOST} ^example.com [nc] 
RewriteRule ^$ /subdirectory/ [nc,L,QSA] 

RewriteCond %{HTTP_HOST} ^www.example.com [nc] 
RewriteRule ^$ /subdirectory/ [nc,L,QSA] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 

還有一點需要注意。由於我的網站中的所有元素都使用相對路徑,因此我必須將HTML根目錄設置爲子目錄才能使其工作,因爲由於重寫過程中網站HTML的相對路徑正在查看文件的錯誤根目錄。即他們鏈接到實際的根目錄,而不是子目錄。我的HTML根/基極設置爲子目錄如下:

<head> 
<base href="http://<?php echo $_SERVER['HTTP_HOST']; ?>/subdirectory/" /> 
</head> 

更新:

好了,所以我得到了一步。當我將網站文件放入根目錄的子目錄中時,下面的代碼有效。

但是,它仍然存在問題。雖然它將example.com重定向到example.com/subdirectory,但並未將example.com/index.php重定向到example.com/subdirectory/index.php。

我仍然試圖找出如何做到這一點,以便它可以處理所有文件,包括index.php。

#Redirect a domain to a subdirectory, while displaying only the domain and not the subdirectory in the browser address bar. 
<IfModule mod_rewrite.c> 

Options +FollowSymLinks 

RewriteEngine On 

RewriteBase/

RewriteCond %{HTTP_HOST} ^example.com [nc] 
RewriteRule ^$ /subdirectory/ [nc,L,QSA] 

RewriteCond %{HTTP_HOST} ^www.example.com [nc] 
RewriteRule ^$ /subdirectory/ [nc,L,QSA] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 

還有一點需要注意。由於我的網站中的所有元素都使用相對路徑,因此我必須將HTML根目錄設置爲子目錄才能使其工作,因爲由於重寫過程中網站HTML的相對路徑正在查看文件的錯誤根目錄。即他們鏈接到實際的根目錄,而不是子目錄。我的HTML根/基設置爲子目錄如下:

<head> 
<base href="http://<?php echo $_SERVER['HTTP_HOST']; ?>/subdirectory/" /> 
</head> 
+0

子域中的內容是否與舊域中的內容完全相同? – 2013-05-10 19:50:03

+0

是同一臺服務器上的域和子域? – miah 2013-05-10 19:50:42

+0

@misplacedme:不,子域中的內容不同。 – 2013-05-10 20:01:37

回答

0

如果重寫規則的域名不匹配,則Apache會在地址欄中改寫。

RewriteCond %{HTTP_HOST} ^(www\.)?domain.com 
RewriteRule ^(.*)$ subdomain_directory/$1 [QSA L] 

如果不是在同一個目錄中,您可以創建在你的域目錄符號鏈接,鏈接到你的子域目錄,這應該工作。如果尚未設置,則需要允許FollowSymlinksSymLinksIfOwnerMatch

+0

你說得對,重寫規則中的域不匹配。 您或其他人可以使用FollowSymlinks和/或SymLinksIfOwnerMatch發佈代碼示例嗎?我在網上找了它,但還沒有找到一個代碼示例,但它完全符合我的要求。 – 2013-05-10 21:34:47

+0

如果你有ssh訪問權限,你可以運行'ln -s {/ path/to/subdomain-directory} {link-name}',其中link-name是你在重寫過程中引用的文件。如果您沒有shell訪問權限,那麼您需要詢問您的託管公司是否可以爲您設置它。 – miah 2013-05-10 21:53:23

+0

我不知道我明白你在說什麼。 我的意圖是通過將腳本添加到domain.com根目錄中的htaccess文件來實現此目的。 – 2013-05-10 22:19:15

0

更新2:

此代碼似乎是爲我工作:

#Redirect a domain to a subdirectory, while displaying only the domain and not the subdirectory in the address bar of a browser 
<IfModule mod_rewrite.c> 

Options +FollowSymLinks 

RewriteEngine On 

RewriteBase/

RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com 
RewriteCond %{REQUEST_URI} !/subdirectory/ 
RewriteRule ^(.*)$ /subdirectory/$1 [L] 

</IfModule> 

那塊htaccess的代碼做的網站的代碼打破HTML的路徑,但是這可以通過重新定義HTML被反擊通過在網站上像這樣的標題添加HTML基礎標籤的基本路徑:

<head> 
<base href="http://www.mydomain.com/subdirectory/" /> 
</head> 

而且你必須格外小心,在你的網站開通路徑/鏈接e的Javascript代碼來讓這些工作。

關於PHP中的路徑,您需要使用相對路徑來保持重定向後網站的PHP代碼正常工作。

我花了兩天的時間纔將這一切全部用了4個小時的睡眠時間,因爲很多在線提供的htaccess代碼根本無法工作。希望這會爲一些其他人節省很多工作,壓力和挫折。

祝你好運。 :)

相關問題