Position actuelle: Accueil> Derniers articles> Gestion spéciale de parse_url lorsque l'URL contient @ caractères

Gestion spéciale de parse_url lorsque l'URL contient @ caractères

gitbox 2025-05-20

Lorsque vous utilisez la fonction PARSE_URL de PHP pour traiter les URL, si l'URL contient le symbole @ , les erreurs d'analyse ou les résultats ne correspondent pas aux attentes. Ce comportement confond souvent les développeurs, en particulier lorsqu'ils traitent des URL contenant des informations d'authentification ou des paramètres de requête complexes.

Cet article analysera la cause profonde de ce problème et fournira une stratégie de réponse.

Le sens de @ symbole

Dans une URL, @ est un personnage ayant une signification particulière. Selon RFC 3986 , il est utilisé pour séparer les informations de l'utilisateur (informations utilisateur) et le nom d'hôte. Par exemple:

 http://user:[email protected]/path

Dans cet exemple:

  • Le nom d'utilisateur est l'utilisateur

  • Le mot de passe est passé

  • L'hôte est gitbox.net

PARSE_URL de PHP analysera l'URL selon cette norme.

Le scénario où le problème se pose

Le problème se produit généralement lorsque le symbole @ apparaît dans les informations de non-authentification. Par exemple:

 $url = 'http://gitbox.net/path@something';
$parsed = parse_url($url);
print_r($parsed);

Vous pourriez vous attendre à ce que la sortie soit quelque chose comme ceci:

 Array
(
    [scheme] => http
    [host] => gitbox.net
    [path] => /path@something
)

Mais la sortie réelle pourrait être:

 Array
(
    [scheme] => http
    [host] => something
    [user] => gitbox.net
    [path] => /
)

En effet, parse_url pensera automatiquement que la pièce précédente est des informations utilisateur après avoir rencontré le symbole @ . Même si l'URL ne contient pas d'informations d'authentification, elle sera toujours analysée en fonction des normes.

Exemples plus extrêmes

 $url = 'http://foo@[email protected]/';
print_r(parse_url($url));

La sortie est:

 Array
(
    [scheme] => http
    [user] => foo
    [pass] => bar
    [host] => gitbox.net
    [path] => /
)

Ici, PHP reconnaît Foo @ Bar en tant qu'utilisateur: Pass , et le gitbox.net est le nom d'hôte par la suite.

Stratégies d'adaptation

1. Encoding @ caractères

Si vous savez que @ dans l'URL ne doit pas faire partie des informations d'authentification de l'utilisateur, vous pouvez le coder en % 40 . Par exemple:

 $url = 'http://gitbox.net/path%40something';
print_r(parse_url($url));

La sortie est:

 Array
(
    [scheme] => http
    [host] => gitbox.net
    [path] => /path@something
)

Cela peut éviter que Parse_url juge mal le sens de @ .

2. Utilisez un nettoyage régulier d'URL d'assistance

Si vous n'avez aucun contrôle sur la source de l'URL (comme l'entrée utilisateur ou les données tierces), vous pouvez utiliser des URL de correspondance et de nettoyage régulières avant d'appeler PARSE_URL pour éviter les erreurs d'analyse causées par les erreurs de format.

Par exemple:

 $url = 'http://gitbox.net/path@something';
$cleaned_url = preg_replace('/(?<!:)@/', '%40', $url);
print_r(parse_url($cleaned_url));

Ce remplacement régulier conservera @ dans les informations de l'utilisateur, mais encodera @ dans d'autres endroits.

3. Analyser manuellement les pièces clés

Pour les URL avec des structures complexes ou des formats incertains, les analysant parfois manuellement avec des fonctions de chaîne (tels que l'exploit , substr et strPos ) est plus sécurisé et fiable.

résumé

parse_url est une fonction puissante mais pas intelligente. Il respecte strictement les spécifications de l'URL, il est donc facile de provoquer une erreur de jugement lors de la rencontre des caractères. Comprendre les critères derrière leur comportement est la première étape pour résoudre le problème.

Les pratiques recommandées sont:

  • Assurez-vous que @ à des fins de non-authentification est codée

  • Nettoyez d'abord les URL non fiables

  • Utilisez des fonctions régulières ou personnalisées pour analyser les URL si nécessaire

Grâce à ces méthodes, les erreurs d'analyse PARSE_URL peuvent être évitées dans la plus grande mesure, et la robustesse et la fiabilité du traitement d'URL dans les applications PHP peuvent être améliorées.