-
-
Save pulipulichen/b677a286c87fb2829e8f0114a329032c to your computer and use it in GitHub Desktop.
NGINX,Reverse Proxy,Web Server
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
看看網頁版全文 ⇨ 如何取得使用者的IP?從反向代理伺服器、網頁伺服器到程式語言來看 : How to Get the User's IP? From Reverse Proxy Server, Web Server to Programming Language | |
https://blog.pulipuli.info/2023/04/blog-post_18.html | |
看來目前是做不到「真的透明」的反向代理伺服器了。 | |
---- | |
# 真實IP / The "Real IP"。 | |
網路服務中加入反向代理伺服器的人,通常都會有這個問題:「怎麼取得使用者真實的IP?」。 | |
如果你使用PHP,那我們通常會用$_SERVER["REMOTE_ADDR"]來取得使用者的IP位置。 | |
但如果該伺服器位於反向代理伺服器的後頭,那$_SERVER["REMOTE_ADDR"]抓到的會是反向代理伺服器的IP,並非來自使用者真實的IP。 | |
為此,使用NGINX架設反向代理伺服器的教學中,大多會建議在反向代理伺服器的NGINX中加入以下設定,將使用者的IP包裝在X-Real-IP中。 | |
```` | |
proxy_set_header X-Real-IP $remote_addr; | |
```` | |
如此一來,後端伺服器(backend,或說是上游伺服器 upstream)的PHP程式碼便能在 $_SERVER["HTTP_X_READ_IP"]取得使用者真實的IP (192.168.122.1)。 | |
再回來看到這張網路架構圖。 | |
在取得使用者IP的這個問題上,可以把整體架構分成四個角色:。 | |
- 使用者 (Client) :這裡真實IP給的例子是192.168.122.1。 | |
- 反向代理伺服器 (Reverse Proxy):使用NGINX架設。該伺服器的IP是192.168.122.133。 | |
- 網頁伺服器 (Web Server):提供網頁內容的真實網頁,可以用Apache架設,也可以用NGINX架設。IP是192.168.122.77。 | |
- PHP:產生網頁的程式語言。該程式語言用來辨別使用者IP的主要方式是$_SERVER["REMOTE_ADDR"]。但如果反向代理伺服器有設定X-Real-IP的話,也可以用$_SERVER["HTTP_X_REAL_IP"]取得使用者的IP。 | |
當我們在討論「如何取得使用者IP」的問題時,一定要搞清楚我們討論的角色是哪一層。 | |
到底是後端的程式語言PHP或ASP.NET?還是網頁伺服器的Apache或NGINX?還是我們想要在前端的反向代理伺服器實作這個功能?。 | |
理想上,如果能在反向代理伺服器就將使用者的真實IP傳遞給後端的網頁伺服器跟程式語言,而且能夠讓後端伺服器誤以為請求就是來自使用者本人,那應該是最理想的做法。 | |
但目前的結論是:做不到。 | |
---- | |
繼續閱讀 ⇨ 如何取得使用者的IP?從反向代理伺服器、網頁伺服器到程式語言來看 : How to Get the User's IP? From Reverse Proxy Server, Web Server to Programming Language | |
https://blog.pulipuli.info/2023/04/blog-post_18.html |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment