2011-04-27 82 views
1

我遇到了麻煩,使用mod_rewrite並需要幫助。使用Apache 2.2 mod_rewrite來合併子域

我有在DMZ的反向代理,其接受來自外部客戶端請求的子域sub1.example.comsub2.example.com請求和公司內部網絡,內internal.example.com它們轉發(透明),以一個單一的機器。具體做法是:

  1.   → http://internal.example.com
  2. https://sub1.example.comhttps://internal.example.com
  3. http://sub2.example.com   → http://internal.example.com
  4. https://sub2.example.comhttps://internal.example.com

雖然我無法控制執行重定向的DMZ中的代理服務器,但我確實完全控制了internal.example.com,它承載了Apache 2.2並偵聽了80443並加載了mod_rewrite

我需要配置此Apache實例至(上HTTP或HTTPS sub1sub2)執行的任何四個以上的子域的地址的重定向到第四地址https://sub2.example.com(4)。要做到這一點,我目前使用的httpd.conf如下:

RewriteEngine On 
RewriteCond %{HTTPS} !=on 
RewriteRule ^/?(.*) https://sub2.example.com/$1 [R=301,L] 

這個作品在重定向該請求客戶端地址(1)和(3)(即,子域的HTTP地址),以正確的目標(4 ),但是在重寫對地址(2)的訪問中沒有效果。重定向(2) - (4),我已經添加了以下到VirtualHost要素配置SSL環境:

RewriteEngine On 
RewriteCond %{SERVER_NAME} =sub1.example.com 
RewriteRule ^/?(.*) https://sub2.example.com/$1 [R=301,L] 

如果客戶要求通過HTTPS sub1.example.com(通過mod_rewrite的記錄確認)現在這是觸發。然而,雖然從機測試後面所述DMZ(內部和在同一網絡internal.example.com上)時重定向現在正常工作,它們不能將其外部的任何網絡,上工作,其中:

  • 的HTTP子域(1和3)的地址無法完全加載
  • 子域(2和4)的HTTPS地址在客戶端瀏覽器中產生錯誤,該錯誤報告執行了太多重定向。

任何人都可以提出我哪裏出了錯,或者可能是我的情況更合適的配置?提前致謝!

回答

0

問題是重定向會觸發來自客戶端瀏覽器的新請求。所以他要求sub2.example.com和DMZ反向代理不明白這一點。

也許它可以沒有[R=...]工作,但我甚至不確定,因爲它可能仍然會觸發請求。當然,它不再是一個重定向。

由於反向代理是您的前端界面,因此您需要他了解sub2.xxx,否則它將無法工作。

+0

我不知道我關注你 - 正如我在文章開頭所描述的那樣,DMZ中的反向代理被配置爲識別並轉發來自客戶端的請求,要求子域名爲'sub2'的內部計算機('internal.example.com')。我懷疑問題是重寫規則本身,它們以某種方式導致重定向循環,但我不確定。 – antonsyd 2011-04-28 00:18:05

0

雖然我沒有使用我的解決方案完全像你的問題,但我懷疑有比使用重寫更簡單的方法。 (注意:以下假設內部DNS將您的一臺服務器識別爲IP來解析所有的子域,如果情況並非如此,那麼應該進行此更改......我不知道如果發生什麼情況會發生什麼它沒有,但我也沒有設立反向代理...)

嘗試以下操作: - 在httpd.conf中@結束驗證是否出現以下行:

NameVirtualHost *:80 

- 最後爲每個子域添加一個VirtualHost,如下所示:

<VirtualHost *:80> 
ServerName sub1.example.com 
ServerAlias sub1 
DocumentRoot "X:/path/to/website/for/internal.example.com" 
</VirtualHost> 

*重要提示:您可能只能使用一個虛擬主機條目。 要做到這一點嘗試以下操作:

<VirtualHost *:80> 
ServerName internal.example.com 
ServerAlias sub1.example.com 
ServerAlias sub2.example.com 
ServerAlias sub3.example.com 
DocumentRoot "X:/path/to/website/for/internal.example.com" 
</VirtualHost> 

非常重要提示: 這可能不是完全一樣的方式使用SSL(端口443)工作。 我不知道,因爲我還沒有做很多與虛擬主機& SSL。 爲了使用此方法正確設置SSL,請閱讀以下內容:http://httpd.apache.org/docs/2.2/ssl/ssl_faq.html#vhosts2摘要,有時執行上述操作,[即完成所有操作,但使用端口443而不是80],但這取決於某些因素,您也可能只想執行 NamedVirtualHost 192.168.1.1:443 以及文章中所述的其他可能的配置更改)。

希望這會有所幫助!