Dans les applications Web modernes, il devient de plus en plus courant d'utiliser CDN (Content Distribution Network) pour accélérer le chargement des ressources. Les CDN peuvent augmenter les vitesses de chargement par le contenu en cache et la distribuer aux serveurs du monde entier. Cependant, dans certains cas, les CDN peuvent également causer certains problèmes, en particulier lors de l'identification des informations du périphérique client.
La fonction get_client_version est généralement utilisée pour obtenir les informations de la version du client, en particulier dans les scénarios où le type de périphérique ou le numéro de version du terminal doit être jugé. Cette fonction détermine généralement le type ou la version de l'appareil en fonction de certaines informations dans l'en-tête ou URL HTTP demandée.
Supposons que nous ayons une fonction PHP comme suit:
function get_client_version() {
// Obtenir l'agent utilisateur
$user_agent = $_SERVER['HTTP_USER_AGENT'];
// Supposons que nous voulons juger la version de l'appareil en fonction de l'agent utilisateur
if (strpos($user_agent, 'Android') !== false) {
return 'Android Version 10';
} elseif (strpos($user_agent, 'iPhone') !== false) {
return 'iPhone Version 12';
} else {
return 'Unknown Device';
}
}
Dans l'exemple ci-dessus, la fonction get_client_version obtient les informations d'utilisateur-agent du client via $ _server ['http_user_agent'] , faisant ainsi un jugement sur le type de périphérique.
Dans des circonstances normales, la fonction get_client_version obtient des informations de périphérique via l'agent utilisateur demandé par HTTP. Cependant, lorsque les applications Web sont déployées dans un environnement CDN, les problèmes suivants peuvent survenir, ce qui entraîne un biais d'identification des appareils:
Problèmes de mise en cache
Le CDN mettra en cache des ressources statiques et les distribuera aux serveurs locaux. Dans certains cas, le CDN cache les informations d'agent utilisateur dans l'en-tête de demande. Si différents terminaux demandent la même ressource, le CDN peut renvoyer une réponse en cache et les informations d'agent utilisateur de cette réponse sont incompatibles avec le dispositif de borne réel demandé. En conséquence, la fonction get_client_version peut mal juger l'appareil du client.
Couche proxy de CDN
Un serveur CDN agit généralement comme un proxy, transmettant la demande d'origine au serveur backend. Dans ce processus, le serveur proxy du CDN modifie parfois l'en-tête de demande ou modifie certaines informations en fonction de la stratégie d'équilibrage de charge, comme l'agent utilisateur . Cela entraînera la fonction GET_Client_version pour obtenir les mauvaises informations de périphérique.
Impact de l'adresse IP <br> Parfois, le CDN déterminera la source de la demande en fonction de l'adresse IP, puis déterminera le type de périphérique. Cependant, comme les CDN distribuent généralement les demandes à différents serveurs, ces jugements peuvent ne pas être exacts. Surtout lorsque la même demande d'adresse IP provient de différents terminaux, le CDN peut les considérer par erreur comme le même appareil, affectant ainsi la détermination de la version.
Pour éviter les dispositifs de terminaux mal jugés lors de l'utilisation de la fonction get_client_version dans un environnement CDN, vous pouvez considérer les méthodes suivantes:
Désactiver le cache <br> Pour les demandes d'obtention d'informations sur l'appareil, essayez d'éviter le cache CDN. Cela peut être réalisé en définissant des politiques de cache spécifiques (telles que la désactivation du cache, en ajoutant des en-têtes de cache, etc.). De cette façon, le CDN demandera le backend pour obtenir les dernières informations de l'appareil à chaque fois.
Vérifiez l'en-tête de demande du client réel <br> Utilisez des champs d'en-tête tels que X-Forwanded-For pour vous assurer que les informations de demande d'origine la plus proche du terminal sont obtenues, plutôt que l'en-tête de demande modifiée par la couche proxy CDN.
Utilisez JavaScript pour obtenir des informations sur l'appareil <br> Dans certains cas, les informations de l'appareil peuvent être obtenues sur le client via JavaScript au lieu de s'appuyer sur l' agent utilisateur côté serveur. Cela peut éviter les interférences de la couche CDN. L'exemple de code pour obtenir des informations sur les périphériques via JavaScript est le suivant:
var deviceInfo = navigator.userAgent;
console.log(deviceInfo); // Dispositif de sortieUser-Agentinformation
Ces informations sont ensuite transmises au serveur pour s'assurer que le serveur peut identifier correctement l'appareil.
Demande dynamique <br> Pour les fonctions qui nécessitent des informations précises sur l'appareil, la fonction get_client_version peut être placée dans une demande distincte au lieu d'une ressource statique mise en cache via le CDN. Cela rend le processus d'acquisition d'informations de l'appareil plus précis et plus dynamique.
Dans l'environnement CDN, la fonction Get_Client_version peut être affectée par des facteurs tels que le cache et l'interférence de la couche proxy, entraînant une erreur de jugement du dispositif terminal. Pour éviter cela, les développeurs peuvent utiliser des méthodes telles que la désactivation du cache, la garantie de l'acquisition de l'en-tête de demande d'origine et l'utilisation de JavaScript pour obtenir des informations sur l'appareil pour assurer la précision de l'identification de l'appareil. Grâce à ces optimisations, il peut mieux garantir l'acquisition précise des informations sur l'équipement terminal et améliorer l'expérience utilisateur.