2014-03-05 147 views
0

如何在nginx url中傳遞參數。當我點擊http://127.0.0.1:1000/samp/test1/result?num1=10&num2=30時,它應該將我重定向到http://127.0.0.1:80/samp/test1/result?num1=10&num2=30。這可能嗎?以下是我的nginx配置文件。將參數傳遞給nginx url

upstream apache { 
server 127.0.0.1:1000; 
} 
server { 
listen  80; 
server_name 127.0.0.1; 
location/{ 
    #root html; 
    #index index.html index.htm; 
    #return 503; 
    proxy_pass   http://apache; 
} 
} 
+0

我有點困惑你在問什麼。你有一個上游'apache'配置爲可以在端口1000上訪問,並且你有nginx在端口80上監聽。如果直接進入端口1000,你完全繞過了nginx - 這意味着,nginx不能重寫那個請求。 –

+0

@Dan Farrell如果我點擊1000端口,那麼它應該將我重定向到nginx端口,因爲我希望所有的請求都由80服務。 – user3180402

回答

0

我認爲你想要做的是possibe,但是你必須在apache結束的時候改變配置。

如果「阿帕奇」處理的請求進入端口1000直接,它會看到一個URI是這樣的:

http://127.0.0.1:1000/samp/test1/result?num1=10&num2=30 

但是,如果它是通過nginx的發送,它看起來更像是這樣的:

http://apache/samp/test1/result?num1=10&num2=30 

因此,您可以檢查傳入的URL:1000,然後在apache端重寫請求以轉到端口80(這是默認設置,因此您不需要:80 - 您可以保留未詳細說明端口

如果後端真的是apache,那麼您可以在那裏使用重寫規則來處理重寫。

但是,如果您尚未在端口80上,則您沒有連接到nginx - 所以nginx無法爲您重寫。

希望它是有道理的!

以下是我測試:

Apache的身邊,我用一個快速的辛納屈(紅寶石)的應用程序,以打印出完整的URI它看到的要求:

require 'sinatra' 

set :bind, "0.0.0.0" 
set :port, 1025 

get "/*" do 
"<p>Hello from \"apache\"! You've just requested: 
<code>#{request.url}</code></p> 
" 
end 

然後nginx的正是如此配置:

upstream apache { 
    server 192.168.70.1:1025; 
} 

server { 
    server_name localhost; 
    location/{ 
     proxy_pass http://apache; 
    } 

} 

注意我使用了端口1025,因爲端口1000是一個特權端口。

我用捲曲生成請求測試:

$ curl 'http://192.168.70.1:1025/samp/test1/result?num1=10&num2=30' 
<p>Hello from "apache"! You've just requested: 
<code>http://192.168.70.1:1025/samp/test1/result?num1=10&num2=30</code></p> 
$curl 'http://127.0.0.1:80/samp/test1/result?num1=10&num2=30' 
<p>Hello from "apache"! You've just requested: 
<code>http://apache/samp/test1/result?num1=10&num2=30</code></p> 

如果我想要做你所描述的重定向,我可以配合IPV4地址和端口的正則表達式和重定向這樣:

get "/*" do 

    if request.url =~ %r|^http://([0-9]{1,3}\.){3}[0-9]{1,3}:1025/| 
     redirect "http://localhost:80/#{request.fullpath}" 
    else 
"<p>Hello from \"apache\"! Tou've just requested: 
<code>#{request.url}</code></p> 
" 
    end 
end 

現在我告訴curl遵循重定向(-L),我們看到它我重定向到「正確」的路線。

$ curl -L 'http://192.168.70.1:1025/samp/test1/result?num1=10&num2=30' 
<p>Hello from "apache"! Tou've just requested: 
<code>http://apache/samp/test1/result?num1=10&num2=30</code></p> 

我知道這不是你正在使用的語言,但我希望它能幫助你開始。

+0

請注意,在現實世界中,這很少需要,因爲通常您的外部前端(nginx in你的情況)將是唯一一部分堆棧監聽外部可訪問的IP。Apache將在本地主機上(或者在不同系統上的內部IP,就像我的例子中那樣),因此無論如何都無法通過「錯誤的」URL訪問它。有些方法甚至可以在操作系統層的本地主機上執行這個操作(例如iptables) - 但正如我所說的那樣,這樣做是不常見的,因爲後端通常不會公開訪問。 –