環境:
兩台獨立的主機, 分別跑Apache:
主機www: www.domain.com
主機sub: sub.domain.com
不在前端用第三台主機跑Reverse Proxy之下:
主機www有一個連結會連到sub.domain.com, 當連到sub.domain.com時, 導到主機sub, 但網址要改寫成www.domain.com/sub, 且是讀取sub.domain.com的內容. 所有的內部連結都要留在主機sub中.
請教可能的Rewrite方式, 謝謝.
應該是用不到 Rewrite,在 www.domain.com 的 apache 設定裡加一行
<pre class="c" name="code">RedirectMatch ^/sub(/.*)?$ http://sub.domain.com$1
設定就行了。
當然啊~ 重導只需要第一次連 www.domain.com/sub 的時候,若是每次都要,網頁上每個元素都要,那並不是《所有流量都在 sub》上,而是每個 request 都要變兩次 request,對 www 依然會造成負擔。
如果你是要 user 看到瀏覽器的網址 always 是 www.domain.com/sub,那就真的得 reverse proxy,不過用在這樣的需求上,實在是多此一舉。
如果非得要求 user 只能看到 www.domain.com/sub,那何不用 frame 框住網頁就好了?既簡單又達到要求。
wiseguy提到:
那就真的得 reverse proxy,不過用在這樣的需求上,實在是多此一舉。
用Nginx是可以解決問題, 也只能用Reverse Proxy了. 至於是不是多此一舉, 就要看要不要花錢了.
乍看之下,在www上不使用ProxyPass,似乎做不到要求
前提
主機www: www.domain.com
主機sub: sub.domain.com
沒有第三台主機擋在client與www及sub之間做Reverse Proxy
假設
www 的IP: 10.10.10.1
sub 的IP: 10.10.10.2
對client來看(瀏覽器),
www.domain.com始終是10.10.10.1
sub.domain.com始終是10.10.10.2
當client要求http://www.domain.com/sub時
client端的行為會是
1.預備與www.domain.com建立連線,
2.解析www.domain.com的IP是10.10.10.1
3.與10.10.10.1:80建立了連線,送出request-header
對client而言(瀏覽器),在一個很短暫的時間內(dns-cache-expiration),
將不會發生:要求http://www.domain.com/sub,卻與10.10.10.2這個IP連線的情況。
如不要求client使用瀏覽器,則
<pre class="c" name="code">
wget http://10.10.10.1/else/something.html --header="Host:www.domain.com"
<pre class="c" name="code">
wget http://10.10.10.2/sub/subpage.html --header="Host:www.domain.com"
<pre class="c" name="code">
<?php
$r = new HttpRequest('http://10.10.10.2/sub/subpage.html', HttpRequest::METH_GET);
$r->setOptions(array('Host' => 'www.domain.com'));
try {
$r->send();
if ( something true ) {
do something
}
} catch ( exception) {
do something else
}
?>
<pre class="c" name="code">
<?php
$r = new HttpRequest('http://10.10.10.1/else/something.html', HttpRequest::METH_GET);
try {
$r->send();
if ( something true ) {
do something
}
} catch ( exception) {
do something else
}
?>