Je comprends qu'un en-tête HTTP_X_FORWARDED_FOR
est défini par les serveurs proxy pour identifier l'adresse IP de l'hôte qui effectue la demande HTTP via le proxy. J'ai entendu dire que l'en-tête HTTP_CLIENT_IP
est défini à des fins similaires.
HTTP_CLIENT_IP
et HTTP_X_FORWARDED_FOR
?Aucun de ces en-têtes n'est officiellement normalisé. Par conséquent:
What is the difference between HTTP_CLIENT_IP and HTTP_X_FORWARDED_FOR?
- c'est impossible à dire. Différents mandataires peuvent les implémenter ou non. Les implémentations peuvent varier d'un proxy à l'autre, et elles peuvent ne pas l'être. L'absence d'un standard engendre des points d'interrogation.Why would one have different values than the other?
- Voir point 1. Cependant, d'un point de vue purement pratique, la seule raison pour laquelle je peux voir qu'ils ont des valeurs différentes est si plus d'un proxy était impliqué - le X-Forwarded-For:
l'en-tête peut alors contenir une trace complète de la chaîne de transfert, tandis que le Client-IP:
l'en-tête contiendrait l'IP client réelle. Mais ce n'est là que pure spéculation.Where can I find resources on the exact definition of these headers.
- Tu ne peux pas. Voir point 1.Il semble y avoir ne sorte de standard de facto concernant le X-Forwarded-For:
en-tête, mais étant donné qu'il n'y a pas de RFC qui le définit, cela ne peut pas être invoqué voir commentaire ci-dessous.
En remarque, le Client-IP:
l'en-tête doit par convention être X-Client-IP:
car il s'agit d'un en-tête "défini par l'utilisateur".
Vous pouvez également essayer de cette façon:
if (isset($_SERVER['HTTP_CLIENT_IP'])) {
$user_ip = $_SERVER['HTTP_CLIENT_IP'];
} else if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$user_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else if (isset($_SERVER['HTTP_X_FORWARDED'])) {
$user_ip = $_SERVER['HTTP_X_FORWARDED'];
} else if (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
$user_ip = $_SERVER['HTTP_FORWARDED_FOR'];
} else if (isset($_SERVER['HTTP_FORWARDED'])) {
$user_ip = $_SERVER['HTTP_FORWARDED'];
} else if (isset($_SERVER['REMOTE_ADDR'])) {
$user_ip = $_SERVER['REMOTE_ADDR'];
} else {
$user_ip = null;
}