2013-07-02 94 views
10

我使用下面的配置nginx的1.4.1:nginx的與代理斜線傳球

 
server { 
    listen  8000; 
    server_name correct.name.gr; 

    location /test/register { 
     proxy_set_header X-Forwarded-Host $host; 
     proxy_set_header X-Forwarded-Server $host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_pass http://127.0.0.1; 
    } 
} 

當用戶訪問次數http://correct.name.gr:8000/test/register/它們應該被代理到它運行的Apache我想要做的就是端口80.

當我訪問http://correct.name.gr:8000/test/register/我得到正確的結果(index.php)。 當我訪問http://correct.name.gr:8000/test/register/asd時,我得到了正確的結果(來自apache的404)。 當我訪問http://correct.name.gr:8000/test/asd時,我得到正確的結果(來自nginx的404)。 當我訪問http://correct.name.gr:8000/test/register123時,我得到了正確的結果(來自apache的404)。

問題是當我訪問http://correct.name.gr:8000/test/register。我得到了一個301響應,我被重定向到http://localhost/test/register/(注意最後的斜線,當然還有'localhost')!

我還沒有做任何其他配置到Nginx的尾部斜線或類似的東西。你知道什麼是問題嗎?我想要http://correct.name.gr:8000/test/register通過代理到apache正常工作(或者如果不可能,至少發出404錯誤而不是重定向到用戶的本地主機)。

更新1:我想http://correct.name.gr:8000/test/register從不同的計算機比昨天我有不良行爲的一個..那麼,它的工作:我剛剛說向我指出了正確的http://correct.name.gr:8000/test/register/ 301響應!如何從一臺計算機上工作而不是從另一臺計算機上工作(我在兩臺計算機上使用相同的瀏覽器 - Chrome)?我明天再試一次,從第三個測試中看到行爲。

謝謝!

回答

3

我的猜測是你的上游服務器(apache或你的腳本)觸發了重定向到絕對 url http://localhost/test/register/。由於您在proxy_pass指令中使用了http://127.0.0.1,因此nginx找不到域名匹配並按原樣返回Location標題。

我認爲正確的解決方案是不使用絕對重定向,如果重定向是內部網址。這總是一個很好的做法。

但是,不改變上游服務器,有兩個快速解決方案。

可以使用

proxy_pass http://localhost; 

這將告訴nginx的上游的域名localhost。然後,nginx會在上游的Location標題中發現該部分時,知道將http://localhost替換爲http://correct.name.gr:8000

另一種方法是添加一條proxy_redirect行來強制nginx重寫任何位置標頭,其中包含http://localhost/

proxy_pass http://127.0.0.1; 
proxy_redirect http://localhost/ /; 

我更喜歡第一個解決方案,因爲它更簡單。使用proxy_pass http://localhost;時沒有DNS查找開銷,因爲nginx在啓動Web服務器時會提前執行查找。

參考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

1

您是否已經嘗試玩server_name_in_redirect

但是,我發現你通過谷歌的問題,因爲我運行跟蹤斜槓相同的問題。 Nginx強制一個301到相同的URL 尾隨斜線。

+0

不,我沒有嘗試,玩......我明天 - 但看看更新請 – Serafeim

+1

只是爲了避免任何瀏覽器緩存的副作用,我寧願推薦測試這些重定向從殼上捲曲:「curl -IL http://correct.name.gr:8000/test/register」 – vreen

+0

是的,非常好的評論... Curl FTW! – Serafeim