web-dev-qa-db-fra.com

Caractères sécurisés pour une URL amicale

Je dois créer un site Web qui contiendra des articles et j'aimerais créer des URL conviviales, par exemple l'URL de la page avec

Titre: Article Test

devraient devenir: http://www.example.com/articles/article_test.

Bien sûr, je dois supprimer certains caractères du titre, comme ? ou #, mais je ne sais pas lesquels supprimer.

Quelqu'un peut-il me dire quels personnages sont sécuritaires?

153
Paulo

Pour citer la section 2.3 de RFC 3986 :

"Les caractères autorisés dans un URI mais qui n'ont pas de fonction réservée sont appelés non réservés. Ceux-ci incluent les lettres majuscules et minuscules, les chiffres décimaux, le trait d'union, le trait de soulignement et le tilde."

ALPHA  DIGIT  "-" / "." / "_" / "~"

Notez que la RFC 3986 contient moins de signes de ponctuation réservés que l'ancienne RFC 2396 .

187
Skip Head

Vous devez faire attention à deux séries de caractères: réservé et non sécurisé.

Les caractères réservés sont:

  • esperluette ("&")
  • dollar ("$")
  • signe plus ("+")
  • virgule (",")
  • barre oblique ("/")
  • deux points (":")
  • point-virgule (";")
  • est égal à ("=")
  • point d'interrogation ("?")
  • Symbole "At" ("@")
  • pound ("#").

Les caractères généralement considérés nsafe sont:

  • espace (" ")
  • inférieur à et supérieur à ("<>")
  • ouvrir et fermer les crochets ("[]")
  • ouvrir et fermer les accolades ("{}")
  • tuyau ("|")
  • barre oblique inverse ("\")
  • caret ("^")
  • pour cent ("%")

J'en ai peut-être oublié un ou plusieurs, ce qui m'amène à faire écho à la réponse de Carl V. À long terme, il vaut probablement mieux utiliser une "liste blanche" de caractères autorisés, puis encoder la chaîne plutôt que d'essayer de rester au courant des caractères interdits par les serveurs et les systèmes.

101
Gary.Ray

Il est préférable de ne conserver que certains caractères (liste blanche) au lieu de supprimer certains caractères (liste noire).

Techniquement, vous pouvez autoriser n’importe quel caractère, à condition de l’encoder correctement. Mais, pour répondre à l'esprit de la question, vous ne devriez autoriser que ces personnages:

  1. Lettres minuscules (convertir les majuscules en minuscules)
  2. Nombres, 0 à 9
  3. Un tiret - ou un trait de soulignement _
  4. Tilde ~

Tout le reste a une signification potentiellement spéciale. Par exemple, vous pouvez penser que vous pouvez utiliser +, mais vous pouvez le remplacer par un espace. & est également dangereux, surtout si vous utilisez des règles de réécriture.

Comme pour les autres commentaires, consultez les normes et spécifications pour plus de détails.

39
carl

Toujours en sécurité

Celles-ci sont sûres (en théorie/spécifique), essentiellement n'importe où sauf le nom de domaine.
Encodez en pourcentage tout ce qui ne figure pas dans la liste et vous êtes prêt à partir.

    A-Z a-z 0-9 - . _ ~ ( ) ' ! * : @ , ;

Parfois sûr

Sécuritaire uniquement lorsqu'il est utilisé dans des composants URL spécifiques; utiliser avec précaution.

    Paths:     + & =
    Queries:   ? /
    Fragments: ? / # + & =

Jamais en sécurité

Selon la spécification d'URI (RFC 3986), tous les autres caractères doivent être codés en pourcentage. Ceci comprend:

    <space> <control-characters> <extended-ascii> <unicode>
    % < > [ ] { } | \ ^

Si la compatibilité maximale est un problème, limitez le jeu de caractères à A-Z a-z 0-9 - _.
(avec des points uniquement pour les extensions de nom de fichier).

25
Beejor

En regardant RFC3986 - Identifiant de ressource uniforme (URI): Syntaxe générique , votre question porte sur le composant du chemin d'un URI.

    foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
   scheme     authority       path        query   fragment
      |   _____________________|__
     / \ /                        \
     urn:example:animal:ferret:nose

En citant la section 3.3, les caractères valides pour un URI segment sont de type pchar:

pchar = non réservé/pct-encodé/sous-delims/":"/"@"

Ce qui se résume à:

ALPHA / DIGIT / "-" / "." / "_" / "~"

pct-encoded

"!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

":" / "@"

Ou en d'autres termes: vous pouvez utiliser n'importe quel caractère (sans contrôle) de la table ASCII , sauf/, ?, #, [ Et ].

Cette compréhension est soutenue par RFC1738 - Localisateurs de ressources uniformes (URL) .

16
Philzen

sans réserve = ALPHA/DIGIT/"-"/"."/"_"/"~"

12
LKK

D'après le contexte que vous décrivez, je soupçonne que ce que vous essayez réellement de créer s'appelle une "limace de référencement". La meilleure pratique générale connue pour ceux-ci est:

  1. Convertir en minuscule
  2. Convertir des séquences entières de caractères autres que a-z et 0-9 en un trait d'union (-) (sans trait de soulignement)
  3. Supprimez les "mots vides" de l’URL, c’est-à-dire des mots non indexables tels que "a", "une" et "la"; Les mots vides de Google pour les listes volumineuses

Ainsi, à titre d'exemple, un article intitulé "L'usage de! @% $ * Pour représenter Swearing In Comics" aurait un slug de "utilisation-représente-assermentation-comiques".

11
chaos

Le format d'un URI est défini dans RFC 3986 . Voir la section 3.3 pour plus de détails.

6
joschi

Du point de vue du référencement, les traits d'union sont préférés aux caractères de soulignement. Convertissez-les en minuscules, supprimez toutes les apostrophes, puis remplacez toutes les chaînes de caractères non alphanumériques par un seul trait d'union. Supprimez l'excès de traits d'union au début et à la fin.

6
mpen

J'ai eu le même problème, je voulais avoir de jolies urls et j'en suis arrivé à la conclusion que je ne devais autoriser que les lettres, les chiffres et _ dans les urls. C’est très bien, puis j’ai écrit quelques expressions rationnelles de Nice et j’ai réalisé qu’il reconnaissait que tous les caractères UTF8 n’étaient pas des lettres dans .NET et qu’ils étaient foutus. Cela semble être un problème connu pour le moteur de regex .NET. SO je suis arrivé à cette solution:

private static string GetTitleForUrlDisplay(string title)
{
    if (!string.IsNullOrEmpty(title))
    {
        return Regex.Replace(Regex.Replace(title, @"[^A-Za-z0-9_-]", new MatchEvaluator(CharacterTester)).Replace(' ', '-').TrimStart('-').TrimEnd('-'), "[-]+", "-").ToLower();
    }
    return string.Empty;
}


/// <summary>
/// All characters that do not match the patter, will get to this method, i.e. useful for unicode chars, because
/// .NET impl of regext do not handle unicode chars. So we use char.IsLetterOrDigit() which works nicely and we 
/// return what we approve and return - for everything else.
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private static string CharacterTester(Match m)
{
    string x = m.ToString();
    if (x.Length > 0 && char.IsLetterOrDigit(x[0]))
    {
        return x.ToLower();
    }
    else
    {
        return "-";
    }
}
3
Lubomir Toshev

J'ai trouvé très utile de coder mon URL en une adresse sécurisée lorsque je renvoyais une valeur via ajax/php vers une URL qui était ensuite relue par la page.

Sortie PHP avec encodeur d'URL pour le caractère spécial &

//PHP returning the sucess info of ajax request
echo "".str_replace('&','%26',$_POST['name'])." category was changed";

//javascript sending the value to url
window.location.href='time.php?return=updated&val='+msg;

//javascript/php executing the function printing the value of the url,
//now with the text normally lost in space because of the reserved & character.

setTimeout("infoApp('updated','<?php echo $_GET['val'];?>');",360);

J'espère que tout le monde trouvera mes petits extraits de code utiles! :)

1
DIY-Forum

Je pense que vous recherchez quelque chose comme "URL Encoding" - encoder une URL pour qu'il soit "sûr" d'utiliser sur le Web:

Voici une référence pour cela. Si vous ne voulez pas de caractères spéciaux, supprimez simplement ceux qui nécessitent un codage d'URL:

http://www.w3schools.com/TAGS/ref_urlencode.asp

0
Andy White