我認爲你想要做的是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>
我知道這不是你正在使用的語言,但我希望它能幫助你開始。
我有點困惑你在問什麼。你有一個上游'apache'配置爲可以在端口1000上訪問,並且你有nginx在端口80上監聽。如果直接進入端口1000,你完全繞過了nginx - 這意味着,nginx不能重寫那個請求。 –
@Dan Farrell如果我點擊1000端口,那麼它應該將我重定向到nginx端口,因爲我希望所有的請求都由80服務。 – user3180402