F5 是一個 L7 的負載平衡器。
在 F5 可以透過 iRule 來將特定網址導向到特定 pool(nodes),做負載平衡。
例如:
when HTTP_REQUEST { switch [HTTP::host] { "mlwmlw.org" { pool webserver-pool } } }
所以在 webserver-pool 的主機都會接收到來自 F5 的請求。所以在 PHP 裡面如果你檢查 $_SERVER[‘REMOTE_ADDR’] 來當作使用者的IP,就會看到 F5 的 IP,真實的 IP 被另外放在 HTTP_X_FORWARDED_FOR 了。
所以你懶得改程式,想要透過 F5 動手腳讓 REMOTE_ADDR 不要是 F5 的 IP,這樣可行嗎?!
在 iRule 上另外加了一個事件,修改 http header。
when HTTP_REQUEST_SEND { clientside { HTTP::header insert REMOTE_ADDR "[IP::client_addr]" } }
太棒了!你多了一個 $_SERVER[‘HTTP_REMOTE_ADDR’] 能用…(翻桌)
因為 REMOTE_ADDR 是 CGI 送來的變數,不是 http_header,所以要在 apache 裡面動手腳。
可能透過類似這種模組 http://stderr.net/apache/rpaf/ 來修改 apache 傳到 php 的值吧…有點麻煩算了……
參考資源
http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/asg/50/aft/5365/showtab/groupforums/Default.aspx
http://support.f5.com/kb/en-us/solutions/public/4000/800/sol4816.html
不好意思想請教一個問題,
如果經過F5以後,HTTP的header沒有帶X-Forwarded-For的話(從phpinfo看的),是不是F5的設定的問題呢?還apache端的問題? 不好意思。
1.
設定 Virtual Server 的 http profile,enable Insert X-Forwarded-For
2.
用文章中的 iRule 自己插一個 header 名字就能自取了