Apache-2.2

使用 mod_rewrite 作為 VirtualHosts 的替身,在一個 GoDaddy 託管帳戶上託管兩個域

  • November 1, 2011

我正在嘗試在 GoDaddy 託管網站上使用 mod_rewrite 做類似 VirtualHosts 的事情。我有一個託管帳戶和兩個域,a.com 和 b.com。我希望從 ~/html/b_site/document.html 提供對 b.com/document.html 的請求(其中 ~/html/ 是 DocumentRoot,作為 a.com 的根)。我在 mod_rewrite 文件中找到了對這個案例的引用,表明這是可能的,但我沒有成功。這是 ~/html/.htaccess 的內容:

RewriteEngine on
Options FollowSymLinks

RewriteCond %{HTTP_HOST} b\.com$
RewriteBase /
RewriteRule ^(.*)$ b_site$1

結果,當我將瀏覽器指向 b.com 時:位置欄更改為 b.com/b_site/ 並且伺服器以 500 響應。以下 RewriteRule 可以正常工作:

RewriteRule ^(.*)$ b_site/index.html

…這仍然是我能夠獲得除 500 或有關重定向循環的警告之外的唯一方法。RewriteBase 行似乎沒有什麼區別。

為了找出匹配的內容,我編寫了一個簡單的 PHP 腳本,它接受一個查詢參數並列印它,我使用了這個 RewriteRule:

RewriteRule ^(.*)$ b_site/index.php?q=$1

輸出顯示在這種情況下,RewriteRule 匹配“b_site/index.php”。RewriteBase 文件確實暗示應該發生類似的事情,但同樣,RewriteBase 似乎對結果沒有任何影響。對類似問題的回答似乎都歸結為我正在嘗試的相同機制。

有什麼想法嗎?

解決了。不用感謝 GoDaddy 讓您為訪問錯誤日誌付費!

當我看到別人的日誌時,這一切都開始變得有意義了。我現在很清楚遞歸是如何發生的,以及為什麼事情會第二次被重寫(並且無限遞歸,導致 500)。這裡的遞歸問題有一個很好的解決方案(通過 serverfault 使用者 Dave Drager對類似問題的回答)。

我稍微簡化了一下,得出了這個解決方案:

RewriteEngine on

Options FollowSymLinks

RewriteCond %{ENV:REDIRECT_X} =""

RewriteCond %{HTTP_HOST} b.com $ [NC] RewriteRule ^(.*) $ b_site/$1

$$ E=X:1,L $$

您的.htaccess上下文以及RewriteBase都在為RewriteRuleto設置上下文/;這意味著您的替換將接受請求http://b.com/dir_a/page.html並提供服務http://b.com/b_sitedir_a/page.html- 可能無法正常工作。

文件中:

在 .htaccess 文件中使用重寫引擎時,每個目錄的前綴(對於特定目錄始終相同)會自動刪除以進行 RewriteRule 模式匹配,並在任何相對(不以斜杠或協議名稱開頭)替換後自動添加遇到規則集的結尾。

試試這個:

RewriteCond %{HTTP_HOST} ^b\.com$ [NC]
RewriteRule ^(.*)$ b_site/$1

引用自:https://serverfault.com/questions/326247