2010-01-10 35 views
4

我想讓我的主域名從一個子目錄託管(已經完成了這一步),也就是說,當某人在www.example.com/news後面輸入時,它將轉到www.example.com /子目錄/新聞,但仍將顯示爲www.example.com/news。微妙的htaccess問題。我要瘋了

我用下面的代碼BlueHost的做到這一點:

RewriteEngine on 

RewriteCond %{HTTP_HOST} ^(www.)?example.com$ 
RewriteCond %{REQUEST_URI} !^/subdirectory/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /subdirectory/$1 

RewriteCond %{HTTP_HOST} ^(www.)?example.com$ 
RewriteRule ^(/)?$ subdirectory/index.php [L] 

此代碼的工作,如果我在www.example.com/news/(注意尾隨斜線)類型,但是沒有工作,如果我只是請輸入www.example.com/news(不帶斜槓)。任何想法爲什麼?

謝謝。

+0

你有一個名爲'news'的實際目錄可能有衝突嗎? – Skilldrick 2010-01-10 18:43:38

+0

不,我的所有文件夾都位於名爲public的子目錄中。這裏是一般結構: maindomain有兩個子文件夾(應用程序和公共)。在公共場所有子文件夾,稱爲新聞,術語表,關於,等等。 所以沒有實際www.maindomain.com/news,只有www.maindomain.com/public/news – Robert 2010-01-10 19:08:42

+0

此外,爲了澄清,如果我輸入www.mymaindomain.com/news它的作品在於它顯示的頁面在www.mymaindomain.com/public/news,但它也顯示公衆的URL路徑。 – Robert 2010-01-10 19:21:33

回答

0

不是一個真正的回答你的問題,但不會是更容易

  • 更改了DocumentRoot爲公共目錄,或者如果你不能做到這一點(如共享主機上)。 ..
  • 把公共文件放在你的文檔根目錄(public_html或任何它被稱爲的)和應用程序文件在其外部(或者如果你不能超越文檔根目錄,在它內部但保護網絡訪問與Deny from all
+0

是的,我認爲第二種選擇是我必須做的,如果我不能得到這個工作,謝謝你的提示。我會再嘗試一兩天的嘗試,並實施,如果失敗:) – Robert 2010-01-11 15:35:30

1

我覺得這個問題是在Apache將/ news重新寫入/子目錄/新聞之後,它會發現自己的請求與文件系統上的目錄匹配,而該目錄不會以尾部斜線結尾。所以它發出一個重定向到一個新的url,包括尾部的斜線。

事情是,我們確實希望添加traling slash來保留規範的url(否則我們會以/ news和/ news /導致相同的地方結束 - 對相對鏈接,SEO等不利)。 ),只是不太像apache所做的那樣。因此,我們必須自己做,加入以下內容:

RewriteCond %{REQUEST_URI} ^/subdirectory/.*[^/]$ 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^subdirectory/(.*)$ /$1/ [L,R=301] 

此規則的條件將匹配以「子目錄」開頭,DO匹配的fielsysem一個目錄,但不以trainling結束的任何請求削減。 (例如'/子目錄/新聞')。然後,重寫過程發出一個永久重定向到同一個路徑,但以斜線結尾並剝去'subdiretcory'(例如'/ news /')。

然後客戶端會發出'/ news /'的請求,apache會將其重寫到/子目錄/ news /並且不會發出重定向,因爲它以斜槓結束。

快速測試了這一點,它似乎在伎倆。

0

andrewmabbott是對的,並且要解決它,您需要使用ProxyPassReverse。這將重寫所有重定向以使用正確的地址。

這樣做會是這樣的最簡單的方法:

ProxyPassReverse /subdirectory http://www.example.com/ 

然而BlueHost的可能已禁用mod_proxy的,在這種情況下,這是不行的。