Skip to content

Instantly share code, notes, and snippets.

  • Save pulipulichen/b677a286c87fb2829e8f0114a329032c to your computer and use it in GitHub Desktop.
Save pulipulichen/b677a286c87fb2829e8f0114a329032c to your computer and use it in GitHub Desktop.
NGINX,Reverse Proxy,Web Server
看看網頁版全文 ⇨ 如何取得使用者的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