Si quelqu'un envoie une demande XHR de some-client.com
à some-rest.com
, je souhaite obtenir l'origine ( nom de domaine, pas l'adresse IP du client ) de la demande avec PHP.
Les solutions possibles:
$_SERVER['HTTP_Origin']
mais je ne sais pas s'il s'agit d'un standard.$_SERVER['HTTP_Host']
ou $_SERVER['SERVER_NAME']
, mais dans certains cas, cela retourne la valeur réelle hostname
et non la valeur réelle domain
.$_SERVER['REMOTE_ADDR']
donne l'adresse IP du client.Quel est le bon moyen d’obtenir Origin of request comme un nom de domaine avec PHP?
Merci!
Selon l'article Contrôle d'accès HTTP (CORS) par MDN:
Toutes les demandes doivent être définies sur Origin
header pour fonctionner correctement sous le mécanisme CORS (partage de ressources d'origine croisée).
L'en-tête de demande " Origin " fait partie de RFC 6454 et le décrit comme faisant partie du mécanisme CORS et est compatible avec tous les navigateurs conformément au MDN.
Description par MDN:
L'en-tête de la requête
Origin
indique d'où provient l'extraction. Il n'inclut aucune information sur le chemin, mais uniquement le nom du serveur. Il est Envoyé avec les demandes CORS ainsi qu'avec POST demandes. Il est similaire À l'en-tête Referer, mais contrairement à cet en-tête, il ne divulgue pas Tout le chemin.Source: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin
Donc, pour obtenir l'origine de la requête XHR avec PHP, vous pouvez utiliser:
$_SERVER['HTTP_Origin']
Et, dans le cas d'une demande directe, vous pouvez combinerHTTP_REFERER
et REMOTE_ADDR
comme:
if (array_key_exists('HTTP_REFERER', $_SERVER)) {
$Origin = $_SERVER['HTTP_REFERER'];
} else {
$Origin = $_SERVER['REMOTE_ADDR'];
}
Donc, la solution finale possible est:
if (array_key_exists('HTTP_Origin', $_SERVER)) {
$Origin = $_SERVER['HTTP_Origin'];
}
else if (array_key_exists('HTTP_REFERER', $_SERVER)) {
$Origin = $_SERVER['HTTP_REFERER'];
} else {
$Origin = $_SERVER['REMOTE_ADDR'];
}
MDN est Mozilla Developer Network .
Merci beaucoup pour l'aide @trine, @ waseem-bashir, @ p0lt10n et d'autres personnes.
en php, vous pouvez obtenir en utilisant $ _SERVER ['HTTP_REFERER']. si vous utilisez codeigniter, vous pouvez obtenir le référant en utilisant $ this-> agent-> is_referral ().
$_SERVER['HTTP_Origin'] // HTTP Origin header
$_SERVER['HTTP_Host'] // HTTP Host header
$_SERVER['HTTP_REFERER'] // HTTP Referer header
$_SERVER['REMOTE_ADDR'] // HTTP Client's Public IP
Discutons ci-dessus des paramètres $_SERVER
.
Premièrement, XHR est du côté client et est lié à un client http. Comme les en-têtes Origin et Referer ne sont pas obligatoires, un client autre que le navigateur Web standard ne le définira pas. L'en-tête de l'hôte suivant peut ne pas être obligatoire. Si votre serveur REST utilise des hôtes virtuels, cet en-tête est indispensable pour acheminer les demandes correctement. Mais cet en-tête ne contient aucun détail sur le client. La seule chose unique pour le client http est l’adresse IP publique. Mais cela correspond à de nombreux clients, car les fournisseurs d’accès utilisent des traductions d’adresses réseau ou des mandataires.
Puisque tout est relatif et dans les limites, les mécanismes CORS sont construits sur l’en-tête HTTP Origin. Les clients sont censés utiliser des navigateurs standard.
Dans votre cas, mon avis est qu'il est correct de dépendre de l'en-tête Origin. Vous pouvez implémenter le mécanisme CORS si cela vous convient.