Apache-2.2

對子域使用子路徑內部代理,但如果外部客戶端請求該子路徑,則重定向它們?

  • November 6, 2013

我有一個虛擬主機,我想在它上面有幾個子域。 (為了清楚起見,假設我的域是example.com,我只是試圖通過使foo.example.com工作開始,並從那裡建構。)

我發現子域與我所擁有的框架進行非侵入式工作的最簡單方法是通過 mod_rewrite 代理到子路徑。因此,路徑將在客戶端的 URL 欄中顯示為http://foo.example.com/(whatever)>,而實際上它們會在後台提供<http://foo.example.com/foo/(whatever)

我已經設法在我的 VirtualHost 配置文件中做到這一點,如下所示:

ServerAlias *.example.com

RewriteEngine on

RewriteCond %{HTTP_HOST} ^foo\.example\.com [NC]   # &lt;---
RewriteCond %{REQUEST_URI} !^/foo/.*$ [NC]         # AND is implicit with above
RewriteRule ^/(.*)$ /foo/$1 [PT]

(注意:要找到這種特定的工作組合非常困難。具體來說,$$ PT $$在 RewriteRule 上似乎是必要的。我無法讓它與我在其他地方看到的例子一起工作$$ L $$或嘗試只是$$ P $$. 它要麼不顯示任何東西,要麼陷入循環。此外,一些瀏覽器似乎會在收到錯誤循環後記憶體響應頁面……修復後重新載入頁面不會顯示它正在工作!歡迎回饋——無論如何——如果這部分可以做得更好。)

現在我想讓http://foo.example.com/foo/(whatever)提供的內容取決於誰問。如果請求來自外部,我希望客戶端由 Apache 永久重定向,以便他們在瀏覽器中獲取 URL http://foo.example.com/(whatever)。如果它來自 mod_rewrite 內部,我希望該請求由 Web 框架處理……它不知道子域。

這樣的事情可能嗎?

好像你快到了,不是嗎?

使用基於 REMOTE_ADDR 的 RewriteCond,例如:

#
# Provide HTTP redirect "[R]" for network-external requests
# For permanent redirects, use [R=301], but note cache concerns:
# http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/
#
RewriteCond %{REMOTE_ADDR} !^10\.2\.
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{REQUEST_URI} ^/foo/.*$ [NC]
RewriteRule ^/foo/(.*)$ http://foo.example.com/$1 [R]

#
# Pass-Through "[PT]" to subpath URL for subdomain requests
# (Assumes that foo.example.com/foo would serve the same
# content as example.com/foo, if not for the above rule)
#
RewriteCond %{HTTP_HOST} ^foo\.example\.com [NC]
RewriteRule ^/(.*)$ /foo/$1 [PT]

在 REMOTE_ADDR 中針對 10.2.xx 地址使用匹配的範例來自 http://httpd.apache.org/docs/2.2/rewrite/intro.html

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