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?
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 .
Vous devez faire attention à deux séries de caractères: réservé et non sécurisé.
Les caractères réservés sont:
Les caractères généralement considérés nsafe sont:
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.
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:
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.
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 - . _ ~ ( ) ' ! * : @ , ;
Sécuritaire uniquement lorsqu'il est utilisé dans des composants URL spécifiques; utiliser avec précaution.
Paths: + & =
Queries: ? /
Fragments: ? / # + & =
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).
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) .
sans réserve = ALPHA/DIGIT/"-"/"."/"_"/"~"
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:
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".
Le format d'un URI est défini dans RFC 3986 . Voir la section 3.3 pour plus de détails.
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.
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 "-";
}
}
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! :)
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: