iT邦幫忙

0

Apache Rewrite

環境:
兩台獨立的主機, 分別跑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方式, 謝謝.

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

16
wiseguy
iT邦超人 1 級 ‧ 2013-10-07 16:02:05
最佳解答

應該是用不到 Rewrite,在 www.domain.com 的 apache 設定裡加一行

<pre class="c" name="code">RedirectMatch ^/sub(/.*)?$ http://sub.domain.com$1

設定就行了。

看更多先前的回應...收起先前的回應...
bizpro iT邦大師 1 級 ‧ 2013-10-07 17:35:44 檢舉

是啊, 用redirect, 我會試試, 感謝.

bizpro iT邦大師 1 級 ‧ 2013-10-09 11:27:15 檢舉

我試過了, Redirect之後, 網址依然是sub.domain.com, 而不是www.domain.com/sub

wiseguy iT邦超人 1 級 ‧ 2013-10-11 13:34:50 檢舉

當然啊~ 重導只需要第一次連 www.domain.com/sub 的時候,若是每次都要,網頁上每個元素都要,那並不是《所有流量都在 sub》上,而是每個 request 都要變兩次 request,對 www 依然會造成負擔。
如果你是要 user 看到瀏覽器的網址 always 是 www.domain.com/sub,那就真的得 reverse proxy,不過用在這樣的需求上,實在是多此一舉。

wiseguy iT邦超人 1 級 ‧ 2013-10-11 13:38:17 檢舉

如果非得要求 user 只能看到 www.domain.com/sub,那何不用 frame 框住網頁就好了?既簡單又達到要求。

bizpro iT邦大師 1 級 ‧ 2013-10-11 13:46:35 檢舉

wiseguy提到:
那就真的得 reverse proxy,不過用在這樣的需求上,實在是多此一舉。

用Nginx是可以解決問題, 也只能用Reverse Proxy了. 至於是不是多此一舉, 就要看要不要花錢了.

6
qooqoo1127
iT邦新手 3 級 ‧ 2013-10-11 12:57:19

乍看之下,在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
}

?>
bizpro iT邦大師 1 級 ‧ 2013-10-11 13:56:02 檢舉

謝謝您花了許多時間回答, 很專業. 學習囉.

我要發表回答

立即登入回答