Caractères sûrs pour l'url conviviale

J'ai besoin de faire un site web qui aura des articles, et je voudrais faire des URL conviviales pour cela, par exemple l'URL de la page avec

Titre: Article Test

Devrait 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ûrs de garder?

136
demandé sur Alex Shesterov 2009-03-30 01:42:36

13 réponses

Pour citer l'article 2.3 de RFC 3986:

"caractères autorisés dans un URI mais qui n'ont pas le but est appelé sans réserve. Ceux ci comprennent les majuscules et les minuscules lettres, chiffres décimaux, trait d'Union, point, trait de soulignement et tilde."

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

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

157
répondu Skip Head 2017-04-19 10:13:37

Il y a deux ensembles de caractères vous avez besoin pour regarder dehors pour: réservés et dangereux.

Les caractèresréservés sont:

  • esperluette ("&")
  • dollar ("$")
  • signe plus ("+")
  • virgule (",")
  • barre oblique ("/")
  • deux-points (":")
  • point-virgule (";")
  • égale ( " = " )
  • point d'interrogation ("?")
  • 'À' symbole ("@")
  • livre ("#").

Les caractères généralement considéré comme dangereux sont:

  • Espace ( "" )
  • inférieur et supérieur à ( " " )
  • ouvrir et fermer les crochets ("[]")
  • ouvrir et fermer les accolades ("{}")
  • tuyau ( " / " )
  • barre oblique inverse ("\")
  • accent circonflexe ("^")
  • pourcentage ("%")

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

93
répondu Gary.Ray 2016-06-19 01:02:02

Il vaut mieux ne garder que certains caractères (liste blanche) au lieu de supprimer certains caractères (liste noire).

Vous pouvez techniquement autoriser n'importe quel caractère, aussi longtemps que vous l'encodez correctement. Mais, pour répondre dans l'esprit de la question, vous ne devez autoriser que ces caractères:

  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 un potentiel signification spéciale. Par exemple, vous pouvez penser que vous pouvez utiliser +, mais il peut être remplacé par un espace. & est dangereux, aussi, 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.

36
répondu carl 2015-11-08 22:03:53

Toujours En Sécurité

Ceux-ci sont sûrs (en théorie/spec), essentiellement n'importe où sauf le nom de domaine.
pour cent-encoder tout ce qui n'est pas répertorié, et vous êtes bon pour aller.

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

Parfois Sûr

Seulement sûr lorsqu'il est utilisé dans des composants D'URL spécifiques; utiliser avec soin.

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

Jamais Sûr

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

    <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).

18
répondu Beejor 2016-11-04 03:58:39

Entière = ALPHA / DIGIT / "-" / "." / "_" / "~"

12
répondu LKK 2010-12-01 22:28:38

En regardant RFC3986 - Uniform Resource Identifier (URI): syntaxe générique, votre question tourne autour du composant path d'un URI.

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

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

Pchar = sans réserve / pct codé / sous-delims / ":" / "@"

Qui se décompose en:

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

pct-encoded

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

":" / "@"

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

Cette compréhension est soutenu par RFC1738 - Localisateurs de Ressources Uniformes (URL).

12
répondu Philzen 2014-07-19 09:56:33

D'après le contexte que vous décrivez, je soupçonne que ce que vous essayez réellement de faire est quelque chose appelé une "limace SEO". La meilleure pratique générale connue pour ceux-ci est:

  1. Convertir en minuscules
  2. convertit des séquences entières de caractères autres que a-z et 0-9 en un trait d'Union ( - ) (pas de soulignement)
  3. supprimez les 'mots d'arrêt' de L'URL, c'est-à-dire les mots non indexables comme 'a', ' an ' et 'the'; Google 'mots d'arrêt' pour les listes étendues

Donc, comme un exemple, un article intitulé " L'utilisation de !@ % $ * pour représenter jurer dans la bande dessinée "obtiendrait une limace de" utilisation-représenter-jurer-bande dessinée".

11
répondu chaos 2009-03-29 22:09:20

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

6
répondu joschi 2009-03-29 21:46:37

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

6
répondu mpen 2009-03-29 22:19:34

J'ai eu un problème similaire, je voulais avoir de jolies URL et je suis arrivé à la conclusion que je ne devais autoriser que les lettres, les chiffres, - et _ dans les URL. C'est bien, alors j'ai écrit une belle regex et j'ai réalisé qu'il reconnaît tous les caractères UTF8 ne sont pas des lettres dans. NET et a été vissé. Cela semble être un problème de connaissance pour le moteur. net regex. Donc, 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
répondu Lubomir Toshev 2012-10-09 10:31:28

J'ai trouvé très utile d'encoder mon url en une URL sûre quand je retournais une valeur via ajax / php à une url qui était ensuite lue par la page à nouveau.

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 quelqu'un trouvera mes petits extraits de code utiles! :)

1
répondu DIY-Forum 2015-03-28 08:02:28

Je pense que vous cherchez quelque chose comme "URL Encoding" - encoder une URL afin qu'elle soit "sûre" à utiliser sur le web:

Voici une référence pour. 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
répondu Andy White 2009-03-29 21:47:12

Entre 3-50 caractères. Peut contenir des lettres minuscules, des chiffres et des caractères spéciaux-point(.), tiret ( -), trait de soulignement (_) et au taux (@).

-3
répondu Ramji 2016-02-23 15:44:00