2010-11-07 61 views
1

我有一個Apache 2.2,我使用mod_rewrite。我的目標是將流量從 http://localhost:80/AA轉發到http://localhost:8090/BB。所以我有一個簡單的規則mod_rewrite返回302找到

重寫規則http://localhost:80/AA的http://本地主機:8090/BB

我的問題是客戶端收到 「302找到」。我希望RewriteRule將 轉發從AA到BB的流量,最後BB會將響應發送給我的客戶端。

我的配置有問題嗎?

+0

我假設有在遊戲中無論是兩個不同的Web服務器在這裏,'一個聆聽80'和'8090'一個聆聽,或你有2個不同的VirtualHosts在這2個端口上監聽Apache嗎? – 2010-11-07 15:12:12

+0

一個tomcat服務器位於http:// localhost:8090/BB。不過,我不想告訴我的客戶更改網址。所以我安裝了apache以使用mod_rewrite功能,並從端口80 t0 8090發送流量。我不知道這是否是最佳解決方案... – cateof 2010-11-07 15:21:09

+1

我想我對您的問題感到困惑。當你使用mod_rewrite從一臺主機重定向到另一臺主機時,你*會得到兩個發送到瀏覽器的響應。第一個是302,它告訴瀏覽器轉到第二個URL。第二個響應應該是200.除了響應代碼之外,重定向是否工作? – bmb 2010-11-07 16:35:35

回答

0

RewriteRule的左側或圖案應該只是要匹配的文件名,例如, ^/AA$。如果您還想確保主機和端口匹配特定值,則應設置RewriteCond匹配%{HTTP_HOST}%{SERVER_PORT}。但是後者可能是不必要的,除非您的Web服務器配置了多個域和端口。

這是未經測試,但這樣的事情:

RewriteCond %{HTTP_HOST} ^localhost 
RewriteCond %{SERVER_PORT} ^80$ 
RewriteRule ^/AA$   http://localhost:8090/BB 

我建議你嘗試就這第一:

RewriteRule ^/AA$   http://localhost:8090/BB 

,如果你需要他們添加的RewriteCond的。

根據意見編輯:如果您嘗試避免「302」響應,則無法爲您描述的情況做到這一點。當你使用mod_rewrite從一臺主機重定向到另一臺時,你會得到兩個發送到瀏覽器的響應。第一個是302,它告訴瀏覽器轉到第二個URL。第二個響應應該是200.

使用mod_rewrite時,如果在相同的服務器和端口上重寫從一個頁面到另一個頁面,則可以避免中間的重定向。在這種情況下,重寫是內部的,即使請求是針對AA,Web服務器也可以用BB頁面進行響應。如果使用不同的服務器或端口,AA的Web服務器無法訪問頁面BB,因此它會將重定向響應爲有權訪問的服務器。

如果您可以重新配置站點以使用AA和BB的相同端口,則可以使其工作。如果沒有,我認爲你可以用mod_proxy做你想做的事。我從來沒有使用mod_proxy,所以我不知道你需要做什麼。

+0

我只用了你的RewriteRule,並在行尾添加了[R = permanent,L]。結果是將錯誤301發送回客戶端。我想要的是從AA轉發到BB的規則,然後服務器在8090處將向我的客戶端發送http 200 OK – cateof 2010-11-07 16:07:02

+1

在8090處的BB頁面是否已成功顯示?如果是這樣,那麼它工作。 :80發送301或302重定向,然後8090發送200.使用mod_rewrite從一臺服務器重定向到另一臺服務器時,您無法避開中間的301。 – bmb 2010-11-07 16:38:28

+0

mod_proxy的問題在於,您不能在替換URL中使用問號字符。例如foo.example.com/bar?lala會發出抱怨,因爲?lala被視爲查詢字符串。這是mod_proxy - cateof 0秒前的問題 – cateof 2010-11-09 16:24:55

1

RewriteRule

的文檔你想做的事是R標誌添加到您的規則,重定向。

RewriteRule http://localhost:80/AA http://localhost:8090/BB [R=permanent,L] 

L爲最後的規則。

+0

我不工作。我現在返回錯誤404 – cateof 2010-11-07 15:30:42

+0

你檢查了返回的頭文件嗎?例如。在Firefox中使用Firebug(或其他瀏覽器中的類似內容)在Net選項卡中。檢查返回的標題(位置和HTTP狀態碼)。那麼,它是否將你重定向到404,還是在第一個請求的頁面上返回404? – Kissaki 2010-11-07 21:00:14

0

如果您希望轉發流量,我猜0123'不能這樣做。你最好使用mod_proxyhttp://httpd.apache.org/docs/2.0/mod/mod_proxy.html#proxypassreverse

來自實例文檔:

ProxyRequests Off 

<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 

ProxyPass /foo http://foo.example.com/bar 
ProxyPassReverse /foo http://foo.example.com/bar 
+0

mod_proxy的問題是您不能在替換URL中使用問號字符。例如http://foo.example.com/bar?lala會投訴,因爲?lala被視爲查詢字符串。這就是mod_proxy的問題 – cateof 2010-11-09 16:24:24

+0

與Apache文檔中的ProxyPass指令一樣:_如果您需要更靈活的反向代理配置,請參閱帶有[P]標誌_的RewriteRule指令。所以試着在你的RewriteRule之後設置[P]標誌,這會省略302 Found響應代碼。 – kolyaseg 2016-06-28 08:04:42