如果Drupal(7.17)網站位於負載均衡器後面,是否有任何解決方法可以獲得實際的用戶IP? 它總是返回我的負載平衡器的IP地址。獲取用戶IP - Drupal網站背後的負載均衡器
0
A
回答
1
你想要的X-Forwarded-For
頭,但幼稚的做法是錯誤的,因爲X-Forwarded-For
can contain multiple IP addresses,代表代理途中。
這裏就是你真正想要的(Ideone):
<?php
// Don't use this function directly to parse arbitrary headers, since it
// assumes that the headers you're passing in are associated with the
// current $_SERVER variable.
function get_client($headers) {
if (isset($headers['HTTP_X_FORWARDED_FOR'])) {
return explode(', ', $headers['HTTP_X_FORWARDED_FOR'])[0];
}
else {
return $_SERVER['REMOTE_ADDR'];
}
}
// You'd want to do this on a server, but not on ideone:
// $headers = getallheaders();
$headers = array('HTTP_X_FORWARDED_FOR' => 'client, proxy1, proxy2');
echo "Client 1: " . get_client($headers) . "\n";
$headers = array('HTTP_X_FORWARDED_FOR' => 'client');
echo "Client 2: " . get_client($headers) . "\n";
// $_SERVER['REMOTE_ADDR'] is blank on ideone but works on servers:
$headers = array();
echo "Client 3: " . get_client($headers) . "\n";
?>
還要注意的是X-Forwarded-For
很容易被欺騙,所以你不應該在安全上下文依靠獨有。例如正確的方法禁止清單也需要知道$_SERVER['REMOTE_ADDR'];
。
1
您是否嘗試過讓使用PHP的IP,這樣的:
if ($_SERVER["HTTP_X_FORWARDED_FOR"]) {
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}
else {
$ip = $_SERVER["REMOTE_ADDR"];
}
2
Drupal有功能ip_address()
function ip_address() {
$ip_address = &drupal_static(__FUNCTION__);
if (!isset($ip_address)) {
$ip_address = $_SERVER['REMOTE_ADDR'];
if (variable_get('reverse_proxy', 0)) {
$reverse_proxy_header = variable_get('reverse_proxy_header', 'HTTP_X_FORWARDED_FOR');
if (!empty($_SERVER[$reverse_proxy_header])) {
// If an array of known reverse proxy IPs is provided, then trust
// the XFF header if request really comes from one of them.
$reverse_proxy_addresses = variable_get('reverse_proxy_addresses', array());
// Turn XFF header into an array.
$forwarded = explode(',', $_SERVER[$reverse_proxy_header]);
// Trim the forwarded IPs; they may have been delimited by commas and spaces.
$forwarded = array_map('trim', $forwarded);
// Tack direct client IP onto end of forwarded array.
$forwarded[] = $ip_address;
// Eliminate all trusted IPs.
$untrusted = array_diff($forwarded, $reverse_proxy_addresses);
// The right-most IP is the most specific we can trust.
$ip_address = array_pop($untrusted);
}
}
}
return $ip_address;
}
相關問題
- 1. 使用負載均衡器獲取(非HTTP)客戶端IP
- 2. 網站負載均衡
- 3. 網絡插座負載均衡器給人錯誤的背後
- 4. 負載均衡器減慢站點
- 5. Softlayer API獲取負載均衡器destinationIpAddress
- 6. ASP.NET負載均衡器IP檢測
- 7. GCP負載均衡器或Kubernetes類型=負載均衡器
- 8. Nginx多負載均衡器或單負載均衡器
- 9. 負載均衡器後面的Socket.io
- 10. 使用負載均衡器
- 11. Amazon EC2負載均衡器上的負載平衡算法
- 12. asp.net負載網站背後
- 13. 基於IP的Nginx負載均衡
- 14. NServiceBus:負載均衡訂戶
- 15. 的Java:落後DNS負載均衡
- 16. Erlang負載均衡器
- 17. 負載均衡
- 18. Socket.io和負載均衡器
- 19. 負載均衡器背後的Rails計劃任務
- 20. Symfony2 EC2負載均衡器背後的HTTPS需求
- 21. Elasticsearch負載均衡器背後的節點
- 22. Akka Http客戶端+負載均衡器
- 23. 負載均衡在localhost UDP由源IP
- 24. 負載均衡服務器
- 25. Drupal負載平衡
- 26. 待辦事項Azure的網站使用粘性IP負載均衡?
- 27. 無法使用Microsoft Azure負載平衡器負載均衡tomcats
- 28. MongoDB負載均衡
- 29. 從Stingray負載平衡器後面的Node.js獲取客戶端IP
- 30. 帶F5負載均衡器的RabbitMQ