Lors du développement d'applications PHP, nous devons souvent utiliser get_client_version () ou des fonctions similaires pour obtenir des informations sur la version client, en particulier lors de l'exécution du versioning d'API, du traitement de la compatibilité client ou de l'analyse statistique. Cependant, dans les applications pratiques, cette fonction ne parvient souvent pas à obtenir correctement le numéro de version client que nous attendons. Cet article explorera les causes communes approfondies de ce problème et de ses solutions.
Plusieurs fois, le client ne transmet pas explicitement le numéro de version au serveur via l'en-tête de demande ou les paramètres de demande. Par exemple, les développeurs frontaux mobiles ou Web peuvent ne pas se rendre compte qu'ils doivent transmettre des informations de version, ce qui entraîne le serveur incapable d'obtenir des données disponibles.
get_client_version () s'appuie généralement sur un en-tête HTTP d'agent utilisateur ou personnalisé (tel que X-Client-Version ) pour extraire les informations de version. Si la logique d'analyse n'est pas suffisamment écrite, comme simplement utiliser Expoit () pour intercepter les chaînes, il est facile d'échouer lorsque différents formats clients ne sont pas unifiés.
Afin de masquer ses propres informations, certains clients peuvent modifier la chaîne d'agent utilisateur , ou même ne pas l'envoyer. Ceci est souvent dû à certains robots ou en outils de demande tiers (tels que Postman).
Si votre application est déployée après avoir utilisé un proxy inversé (tel que Nginx) ou CDN (tel que CloudFlare), il est possible que certains en-têtes soient filtrés par défaut, ce qui a obligé le serveur à ne pas recevoir les informations de version d'origine du client.
Assurez-vous que tous les clients (y compris iOS, Android et Web) passent le numéro de version uniformément dans la demande, par exemple, en utilisant l'en-tête personnalisé suivant:
X-Client-Version: 2.5.1
Dans le code, nous pouvons l'extraire comme ceci:
function get_client_version() {
$headers = getallheaders();
return isset($headers['X-Client-Version']) ? $headers['X-Client-Version'] : 'unknown';
}
Si vous utilisez User-Agent, vous pouvez utiliser le format de version correspondante régulière:
function get_client_version_from_ua() {
$ua = $_SERVER['HTTP_USER_AGENT'];
if (preg_match('/AppName\/([0-9\.]+)/', $ua, $matches)) {
return $matches[1];
}
return 'unknown';
}
Par exemple, la chaîne d'agent utilisateur est:
Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppName/2.3.4
Cette règle peut extraire avec succès 2.3.4 .
Si vous soupçonnez que l'en-tête est filtré, vous pouvez explicitement définir l'en-tête requis pour conserver ou transférer dans la configuration du serveur. Par exemple, ajouter en nginx:
proxy_set_header X-Client-Version $http_x_client_version;
Assurez-vous que le serveur peut obtenir entièrement les informations d'en-tête transmises par le client.
L'ajout d'un journal de débogage pour enregistrer les informations d'en-tête dans la demande aide à localiser rapidement les problèmes. Par exemple:
file_put_contents('/tmp/client_headers.log', print_r(getallheaders(), true));
En affichant le fichier journal /tmp/client_headers.log , vous pouvez savoir quels en-têtes sont transmis par le client.
Vous pouvez temporairement configurer une interface pour produire les informations de demande actuelles pour aider les développeurs de clients à déboguer:
// https://api.gitbox.net/debug/client-info
header('Content-Type: application/json');
echo json_encode([
'headers' => getallheaders(),
'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? 'N/A',
]);
Le problème que get_client_version () ne peut pas obtenir le numéro de version réel n'est souvent pas le défaut de la fonction elle-même, mais le résultat de la transmission irrégulière du client, des méthodes d'analyse incohérentes ou de la configuration du serveur. La clé pour résoudre ce type de problème réside dans l'accord clair entre le client et le serveur , et complété par des outils d'exploitation et de débogage raisonnables, le problème sera naturellement résolu.
Si vous rencontrez également des problèmes similaires, vous pourriez aussi bien vérifier les possibilités ci-dessus une par une, et vous trouverez certainement le nœud du problème.