URL-encodé slash dans l'URL
Ma Carte est:
routes.MapRoute(
"Default", //Route name
"{controller}/{action}/{id}", //URL with params
new { controller = "Home", action = "Index", id = "" } //Param defaults
);
Si j'utilise l'URL http://localhost:5000/Home/About/100%2f200
il n'y a pas d'itinéraire correspondant.
- Je modifier l'URL de http://localhost:5000/Home/About/100
puis la route est de nouveau mis en correspondance.
Est-il un moyen facile de travailler avec des paramètres qui contiennent des barres obliques? D'autres les valeurs d'échappement (espace %20
) semblent fonctionner.
EDIT:
Pour encoder en Base64 fonctionne pour moi. Il rend l'URL laid, mais c'est OK pour l'instant.
public class UrlEncoder
{
public string URLDecode(string decode)
{
if (decode == null) return null;
if (decode.StartsWith("="))
{
return FromBase64(decode.TrimStart('='));
}
else
{
return HttpUtility.UrlDecode( decode) ;
}
}
public string UrlEncode(string encode)
{
if (encode == null) return null;
string encoded = HttpUtility.PathEncode(encode);
if (encoded.Replace("%20", "") == encode.Replace(" ", ""))
{
return encoded;
}
else
{
return "=" + ToBase64(encode);
}
}
public string ToBase64(string encode)
{
Byte[] btByteArray = null;
UTF8Encoding encoding = new UTF8Encoding();
btByteArray = encoding.GetBytes(encode);
string sResult = System.Convert.ToBase64String(btByteArray, 0, btByteArray.Length);
sResult = sResult.Replace("+", "-").Replace("/", "_");
return sResult;
}
public string FromBase64(string decode)
{
decode = decode.Replace("-", "+").Replace("_", "/");
UTF8Encoding encoding = new UTF8Encoding();
return encoding.GetString(Convert.FromBase64String(decode));
}
}
EDIT1:
À la fin il s'est avéré que la meilleure façon était de sauver une jolie chaîne formatée pour chaque article que j'ai besoin de sélectionner. C'est beaucoup mieux, parce que maintenant, je ne coder les valeurs et jamais les décoder. Tous les caractères spéciaux deviennent des "-". Beaucoup de mes db-tables ont maintenant cette colonne supplémentaire "URL". Les données sont assez stables, c'est pourquoi je peux aller dans cette voie. Je peux même vérifier, si les données en "URL" est unique.
EDIT2:
Attention aussi à caractère espace. Il semble ok sur VS serveur web intégré, mais différent sur iis7 Correctement encoder caractère d'espace
- Gath Adams recommande l'encodage Base64 sur tous les paramètres qui peuvent contenir des barres obliques. Il explique également la question plus en détail: l'entrée de Blog: gathadams.com/2009/01/06/...
- Vous pouvez également venir avec d'autres façon de masquer la barre oblique, le dire, le remplacer par quelque chose d'autre par la convention. Je sais. C'est moche, mais au moins l'URL reste peu lisible.
- J'ai remarqué que des barres obliques et les points me donner des erreurs. J'ai fait une rapide helper qui les remplace avec le "slash" et "points". Se demander pourquoi l'Url régulier.Encoder/Décoder de ne pas travailler sur quelque chose. Aussi, pourquoi un caractère d'échappement donner toutes les erreurs?
- gathadams.com/2009/01/06/... donne un "404 - fichier non trouvé" erreur.
- fonctionne à nouveau 🙂
- Waouh, il y partenaire de! Le codage Base64 comprend le caractère de barre oblique trop! Ce n'est pas une solution, vous pouvez compter sur pour ce problème.
- Ce n'est pas un problème de codage de routage; c'est apparemment un bug dans le .NET classe Uri. D'après ma lecture de] l'URI RFC, codée des barres obliques dans le chemin d'accès ne doivent pas être considérés comme des séparateurs de segment. MVC de Routage ne pas avoir une chance de l'obtenir, parce que la classe Uri (à tort) décode les barres obliques, avant de routage de même il voit. Voir la section 2.2 et 2.4 de la RFC. labs.apache.org/webarch/uri/rfc/rfc3986.html#reserved
- Qu'advient-il si la chaîne d'origine contenait un "-" ou "_"?
- Cela est correct. Je ne pense pas que.
- Le personnage quand codé a une barre oblique?
- comme mentionné dans l'url de la barre oblique est valable base64 caractère, de sorte que ce n'aide
- Vous avez raison, comme l'a reconnu dans mon commentaire ci-dessus. L'OP ne doit pas avoir accepté cette réponse. Pour remédier à cela, la sortie de la vanille de l'encodage Base64 pourrait être résolu en remplaçant
+
et/
avec-
et_
, respectivement (et de retour à nouveau à la fin de réception). C'est bien connu, une technique sécuritaire (l'alphabet Base64 lui-même ne contient pas de-
et_
) et une opération pas cher à qui. Cela signifie existant codeur bibliothèques peut encore être utilisé.
Vous devez vous connecter pour publier un commentaire.
Si c'est votre dernier paramètre, vous pouvez faire:
Dans .NET 4.0 bêta 2, l'équipe CLR a offert une solution de contournement.
Ajouter à votre site web.fichier de configuration:
Cela provoque la classe Uri à se comporter conformément à la RFC décrivant les Uri, permettant des barres obliques pour être échappé dans le chemin sans être sans échappement. L'équipe CLR rapports qu'ils s'écartent de la spec pour des raisons de sécurité, et la définition de cette dans votre .fichier de configuration fait, fondamentalement, vous prenez possession de la sécurité supplémentaire facteurs impliqués dans les pas unescaping les barres obliques.
Voici une explication simple de la solution et une récapitulation de ce qui a déjà été dit.
Demande secondaires:
Réponses:
Rincer, répéter, en profiter.
Une autre option est d'utiliser une valeur querystring. Très boiteux, mais plus simple que le codage personnalisé.
Même pour Java /Tomcat.
Il y a toujours un problème si vous avez une codé "/" (%2F) dans votre URL.
RFC 3986 - Section 2.2 dit: "Si les données pour le composant URI serait en conflit avec un caractère réservé du but comme un séparateur, le conflit de données doit être pour cent codé avant l'URI est formée". (RFC 3986 - Section 2.2)
Mais il y a un Problème avec Tomcat:
Donc, si vous avez une URL avec l' %2F caractère, Tomcat retourne: "400 URI non Valide: noSlash"
Vous pouvez passer de la correction de bug dans le script de démarrage de Tomcat:
Vous pouvez éviter le double codage/décodage des suggestions ci-dessus et utilisez simplement HttpServerUtility.UrlTokenEncode et le correspondant UrlTokenDecode.
Qui est intéressante .NET 4. De toute façon, ce lien décrit la RFC 1738 et comprend les caractères qui ont besoin de codage et qui sont un peu "dangereux".
texte du lien
Si je veux un SEO friendly URL, (comme lorsque vous voulez mettre un post sur le forum objet dans l'URL), est de sauter d'encodage et de remplacer tout ce qui n'est pas A-Z, a-z, 0-9.
Pour les codée '/' problème, j'ai pu résoudre mon problème en ajoutant '*' pour catchall le paramètre id, puis a été en mesure de passer un encodés '/' dans le contrôle correctement (le paramètre est une chaîne de caractères avec une codé '/')
Comme l'a suggéré ici lorsque le problème a été confronté par Symfony 1.x les développeurs (+ suggéré dans PHP commentaires pour
urlencode()
):urlencode()
urldecode()
Remarque: vous pouvez utiliser
rawurlencode()
, mais vous aurez toujours à urlencode '/' deux fois.Avantages:
AllowEncodedSlashes
pour ApacheSuffit d'utiliser
Server.UrlDecode
. Il fonctionne, j'ai testé.