Ich verwende Haproxy, um die Ausführung eines Websocket-Servers und eines Lighttpd-Webservers auf derselben Maschine zu ermöglichen. Ich möchte die externe IP-Adresse der Maschine von der Webanwendung abrufen, die auf dem Lighttpd-Server ausgeführt wird.
Ohne Haproxy funktioniert das:
PHP
<?php
$myip = $_SERVER['SERVER_ADDR'];
$myurl = 'http://'.$myip.'/pathToProject/';
define('URL', $myurl);
?>
Aber hinter dem Proxy$_SERVER['SERVER_ADDR'];gibt 127.0.0.1 zurück, was mit dem von mir verwendeten PHP-Framework nicht funktioniert.
haproxy.conf
global
maxconn 4096
nbproc 1
defaults
mode http
frontend all 0.0.0.0:80
timeout client 86400000
default_backend www_backend
acl is_websocket hdr(Upgrade) -i WebSocket
acl is_websocket hdr_beg(Host) -i ws
use_backend socket_backend if is_websocket
backend www_backend
balance roundrobin
option forwardfor
timeout server 30000
timeout connect 4000
server apiserver 127.0.0.1:8080 weight 1 maxconn 1024 check
backend socket_backend
balance roundrobin
option forwardfor
timeout queue 5000
timeout server 86400000
timeout connect 86400000
server apiserver 127.0.0.1:8082 weight 1 maxconn 1024 check
Antwort1
Sie müssen die Option "option forwardfor"
in Ihrer HAproxy-Konfigurationsdatei hinzufügen, damit HAproxy einen neuen Header mit der tatsächlichen IP-Adresse des Besuchers hinzufügt.
Suchen Sie anschließend in Ihrem PHP-Code nach dem Header HTTP_X_FORWARDED_FOR anstelle von REMOTE_ADDR.
foreach (getallheaders() as $name => $value) {
echo "$name: $value<br>\n";
}
Eine vollständige und ausführliche Antwort finden Sie hier:haproxy und Weiterleitung der Client-IP-Adresse an Server
Antwort2
Theoretisch ist dies genau das, was Sie lösen können mit
option originalto
in Ihrem Frontend, gemäß derDokumente.
Ihre Anwendung muss sich auf den X-Original-To-Header verlassen.
Antwort3
danke Leute, es funktioniert....
1) Datei bearbeiten nano /etc/haproxy/haproxy.cfgund füge dort hinzu
defaults
mode http
option forwardfor
2) und in php
<?php
echo '<pre>'; print_r(getallheaders()); echo '</pre>';
// PROBLEM IS each browser has different "x-forwarder-for" some "X-Forwarder-for" and some browser gave you 2x ip "x.x.x.x, x.x.x.x"
foreach ( getallheaders() as $k => $v) {
if ( strtolower($k) == 'x-forwarded-for' ) {
$tmp = explode(', ', $v);
if ( $tmp[count($tmp)-1] != '' )
$_SERVER['REMOTE_ADDR'] = $tmp[count($tmp)-1];
}
}
echo $_SERVER['REMOTE_ADDR'];
?>
3) Sie können die IP-Adresse sehen
Antwort4
So habe ich es gelöst (funktioniert nur unter Linux):
$myip = shell_exec("ifconfig eth0 | awk '/inet / {print$2}' | cut -d: -f2");
$myurl = 'http://'.$myip.'/page/';
define('URL', $myurl);