Estoy implementando la reescritura de URL en ASP.net y mi Url me están causando un mundo de problemas.

La URL que se genera a partir de una base de datos de los departamentos de & categorías. Quiero a los empleados a ser capaz de agregar elementos a la base de datos con cualquiera de los caracteres especiales son adecuados sin que se rompa el sitio.

Yo soy la codificación de los datos antes de construir la Url.

Hay varios problemas…

  1. IIS decodifica la dirección URL antes de que llegue .neta lo que es imposible analizar correctamente cualquier cosa con un «/».
  2. ASP.net se confunde por la url por lo que «~» inútil dentro de ciertas páginas
  3. He migrado de la incorporada en el servidor de prueba a mi servidor IIS local (equipo con XP) y cualquier URL que contenga un codificados & (%26) me da un «Bad Request» de error.
  4. UrlEncode hojas de algunos caracteres de salto de virgen como ‘.’

Yo tenía otros dos mensajes relacionados con este tema, en el momento en que yo sólo vi los pequeños problemas no son el gran problema de aguas arriba. He encontrado algunos trucos registro para resolver la «Solicitud incorrecta» problema pero yo lo voy a implementar en un entorno de alojamiento compartido de decisiones que inútil. También sé que esta es una solución para algún problema de seguridad, así que no quiere necesariamente prescindir de ella sin saber qué lata de gusanos que voy a abrir.

Vez de tratar de forzar .neta me pasa la dirección url de materias, o anular la configuración de IIS, me gustaría hacer realmente seguro Url en el primer lugar.

Voy a notar he intentado AntiXss.URLEncode, HttpUtility.URLEncode, URI.EscapeDataString. Incluso he intentado cosas estúpidas como doble URLEncodng. Hay una utilidad que hace lo que necesito, o lo que realmente necesita para rodar mi propia. Incluso estoy pensando en hacer algo Chapucero como la sustitución de la % con una inusual cadena de caracteres. El resultado final debe ser al menos legible que fue el punto de usar la reescritura de URL en el primer lugar.

Lo siento por el largo post, sólo quería asegurarse de que ha incluido toda la información necesaria. Me parece que no puede encontrar cualquier información relevante sobre esto, y parece que no sería un problema común – así que tal vez me estoy perdiendo algo grande. Gracias por tu ayuda y paciencia con la larga explicación!


De edición para mayor claridad:

Cuando digo que la url se construyen a partir de una base de datos lo que quiero decir es que la estructura de directorios es contstructed de los departamentos y categorías en mi base de datos.

Algunos ejemplos de direcciones URL –

Mitienda./Refrigeración/Bar+Nevera.aspx

Mitienda./Cocina+Equipo.aspx

Mitienda./Cocina/Corte+Tablas.asxpx

Los problemas surgen cuando yo uso un departamento como «Bebida & Bar» o «Pastelería/Decoración» para construir mi URL. A pesar de estar codificado primera causa de los problemas mencionados.

Mi controladores ya están implementadas y funcionando bien, excepto por el carácter especial de los problemas de codificación.

En el interés de la divulgación completa aquí están mis otros puestos relacionados- stackoverflow.com/questions/1274669/… — pregunta Similar, pero yo estaba tratando de fuerza .net para darme la URL original en lugar de la fijación de la codificación en el enlace original. stackoverflow.com/questions/1194900/… Tratando de arreglar el «~» problema antes de que me di cuenta de que había grandes problemas.

OriginalEl autor Kelly Gendron | 2009-08-17

4 Comentarios

  1. 5

    Usted debería considerar la posibilidad de tener una mesa fuera de su categoría/departamento de mesa que tiene una URL única para cada categoría. A continuación, puede utilizar una rutina especial para generar la Url. Esta puede ser una de SQL función escalar o una función CLR, pero una de las cosas que haría es normalizar la dirección URL de la web. Usted puede convertir «Beverage & Bar» a «de la Bebida-Y-Bar» y «Pastelería /Decoración» a «de la Pastelería de Decoración». Principalmente, la rutina necesita para reemplazar todos válidos HTTP URL de personajes con algo más. Un ejemplo es este:

    public static class URL
    {
    static readonly Regex feet = new Regex(@"([0-9]\s?)'([^'])", RegexOptions.Compiled);
    static readonly Regex inch1 = new Regex(@"([0-9]\s?)''", RegexOptions.Compiled);
    static readonly Regex inch2 = new Regex(@"([0-9]\s?)""", RegexOptions.Compiled);
    static readonly Regex num = new Regex(@"#([0-9]+)", RegexOptions.Compiled);
    static readonly Regex dollar = new Regex(@"[$]([0-9]+)", RegexOptions.Compiled);
    static readonly Regex percent = new Regex(@"([0-9]+)%", RegexOptions.Compiled);
    static readonly Regex sep = new Regex(@"[\s_/\\+:.]", RegexOptions.Compiled);
    static readonly Regex empty = new Regex(@"[^-A-Za-z0-9]", RegexOptions.Compiled);
    static readonly Regex extra = new Regex(@"[-]+", RegexOptions.Compiled);
    public static string PrepareURL(string str)
    {
    str = str.Trim().ToLower();
    str = str.Replace("&", "and");
    str = feet.Replace(str, "$1-ft-");
    str = inch1.Replace(str, "$1-in-");
    str = inch2.Replace(str, "$1-in-");
    str = num.Replace(str, "num-$1");
    str = dollar.Replace(str, "$1-dollar-");
    str = percent.Replace(str, "$1-percent-");
    str = sep.Replace(str, "-");
    str = empty.Replace(str, string.Empty);
    str = extra.Replace(str, "-");
    str = str.Trim('-');
    return str;
    }
    }

    Que podría hacer de este un SQL mejorar la función, o de ejecutar URL generación como un proceso independiente. Luego de implementar la asignación, se asignan toda la URL directamente a un ID de categoría. Este enfoque es mejor en el largo plazo por varias razones. En primer lugar, que no siempre son la generación de URLs, de hacerlo una vez y se quedan estáticos, usted no tiene que preocuparse acerca de su procedimiento de cambiar y, a continuación, el Robot de google no ser capaz de encontrar URLs de edad. También, si usted consigue una colisión, usted puede notar un potencial de duplicar el nombre de la categoría, debido a una colisión sólo sería diferente por caracteres especiales. Finalmente, usted puede ver siempre su Url de la base de datos, sin tener que ejecutar la función de asignación.

    Que es absolutamente perfecto. Muchas gracias, me has salvado de más tiempo de lo que quisiera admitir.

    OriginalEl autor eulerfx

  2. 2

    Tengo una reescritura de url de implementar en el mundial.asax en el archivo de comenzar solicitud autenticada como tengo algo de seguridad. Aquí es donde puedo tomar el formato de dirección url y, a continuación, hacer la db de mirar hacia arriba. esto vuelve a escribir la ruta de acceso a la página aspx y todos los parámetros se pasan a través de la cadena de consulta. Sin ningún tipo de codificación es necesario.

    Sin embargo, si usted está utilizando la dirección url de cambiar los datos, a continuación, puedo ver que va a tener enormes problemas de manera efectiva mediante http GET para cambiar la base de datos. Es generalmente considerado como un mal idead, y no algo que yo hago.

    Yo sólo uso una solicitud post a hacer cualquier databse manipulación. Esto mantiene la url limpia como todos los datos en el formulario en la página.

    El único problema que tenía era establecer la dirección url correcta para la página.el formulario.la acción que en la mayoría de los casos es el formato de dirección url.

    Si se trata de la categoría de los nombres que están causando el problema, entonces tal vez usted debería restringir los nombres de alfa sólo caracteres numéricos y de intercambio de espacios para el «-«. IIS se tiro de un tambaleante con períodos «.» como se ve para los nombres de archivo.

    P. S.
    IIS no entender la tilde «~», esto es algo que el compilador entiende. así que si la usas en una etiqueta de anclaje no funcionará como se espera y se debe utilizar la raíz de la aplicación en lugar de la tilde.

    Edición:

    OK, parece un problema con IIS tener problemas con ciertos personajes . /y &. Incluso si usted no urlencode estos IIS todavía se trate de aplicar sus propios significados.
    Como ejemplo considere la posibilidad de la eliminación de ellos así:

    Bebidas & bar se convierte en BeverageBar

    De pastelería /decoración se convierte en PastryDecorating.

    Esto evitará que las url limpias, pero no significa una columna adicional en la base de datos de modo que usted puede cheack la dirección url en contra de este acortado el nombre de la categoría.

    Lo siento, debería haber sido más clara – yo no estoy haciendo ninguna manipulación de bases de datos con mi Url. Mi tienda se divide en departamentos y categorías. En lugar de ser codificado de la estructura de directorios se construye a partir de la base de datos. Los diferentes menús tienen enlaces de la forma Mitienda./o del Departamento de Mitienda.//Departamento de Categoría que mientras codificados y técnicamente correctos están siendo quebrantados por IIS antes de la solicitud, incluso hace volver a mi httpHandler.
    Que podría ser la mejor solución. Yo podría haber sido masivamente más de complicar las cosas. Mi única preocupación es que voy a tener que ser capaz de buscar los elementos de la dirección URL que puede ser complicada por un método no reversible de la codificación. Mi única otra idea era usar Uri.EscapeDataString(b).Replace («%», «_»), que estoy bastante seguro de que me condenaría a programador infierno. Muchas gracias por tus rápidas respuestas y ayuda en esto.. me voy a tomar otra mirada en mi código a ver si esto va a funcionar.
    Muchas gracias por su ayuda. Este es uno de esos momentos en los que estoy profundamente frustrada que no puede aceptar múltiples respuestas. Usted me señaló en la dirección correcta y me llevó de regreso a la pista con esto… Gracias!!!

    OriginalEl autor Daisy Moon

  3. 1

    Estoy teniendo el mismo problema. Gracias por escribir tan bien. Lo que realmente me ayudó a entender mejor el problema.

    Tuve algunas otras consideraciones. Uno de los objetivos que tengo es la de apoyar el potencial para cualquiera de los caracteres en la url que se basa en el título de un artículo. Además quiero para garantizar la unicidad en la codificación y en los dos sentidos proceso de codificación /decodificación.

    Así que hice algo de manual de codificación para resolver el problema. Esto no eliminará completamente por ciento de codificación, pero en gran medida a reducir y mantener a los usuarios de la generación de un inaccesible url. Mi proceso se inicia con la utilización de la Server.URLEncode función. Pero esto no elimina los problemas en la dirección url. Porque IIS es la decodificación de la dirección url y, a continuación, pasar a la aplicación de ciertos personajes va a romper con un peligroso solicitud de excepción. Estos caracteres incluyen +, &, /, !, *, ., ( y ). Entonces, en aquellos personajes, además de otros personajes que me gustaría hacer más legible hago una doble codificación para una más fácil de usar url. La codificación también es difícil debido al número limitado de caracteres que se permiten en un url. Así que antes de la codificación he hecho todas las cartas de capital y, a continuación, hizo la codificación con el menor caso. Esto impide ser totalmente descifrable, pero que puedo hacer fácilmente una coincidencia en la base de datos o en el código, haciendo que el valor que desee para que coincida con estar en mayúsculas.

    Bueno, aquí está mi código. El Feedback se agradece. Oh ya, esto es en VB, pero las cosas se deben transferir a C# bastante fácil.

    Dim strReturn As String = Trim(strStringToEncode)
    strReturn = Server.UrlEncode(strReturn)
    strReturn = strReturn.Replace("-", "dash").Replace("+", "-")
    strReturn = strReturn.Replace("%26", "and").
    Replace("%2f", "or").
    Replace("!", "excl").
    Replace("*", "star").
    Replace("%27", "apos").
    Replace("(", "lprn").
    Replace(")", "rprn").
    Replace("%3b", "semi").
    Replace("%3a", "coln").
    Replace("%40", "at").
    Replace("%3d", "eq").
    Replace("%2b", "plus").
    Replace("%24", "dols").
    Replace("%25", "pct").
    Replace("%2c", "coma").
    Replace("%3f", "query").
    Replace("%23", "hash").
    Replace("%5b", "lbrk").
    Replace("%5d", "rbrk").
    Replace(".", "dot").
    Replace("%3e", "gt").
    Replace("%3c", "lt")
    Return strReturn
    Ya ha encontrado un problema. Análisis de URL rechaza la única oferta inteligente.
    Encuentra muchas citas que hacer urlscan loco. Esto ayudará a solucionarlo. Replace(«%e2%80%99», «rsquo»). Replace(«%e2%80%98», «lsquo»). Replace(«%e2%80%9d», «rdquo»). Replace(«%e2%80%9c», «»»). Replace(«%e2%80%9b», «lsrquo»). Replace(«%e2%80%9f», «ldrquo»).
    Eche un vistazo a la web.los parámetros de configuración como requestFiltering allowDoubleEscaping="true" (stackoverflow.com/a/1453287/1178314) y httpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters="". En mi caso, me permite apoyar a muchos más caracteres en la url.

    OriginalEl autor Nate

  4. 0

    Supongo que usted está buscando HttpUtility.UrlEncode y HttpUtility.HtmlDecode

    string url = "http://www.google.com/search?q=" + HttpUtility.UrlEncode("Example");
    Gracias por la info aunque la cuestión era más que urlencode/decodificar no trabajan, ya sea como asp.net o iis todavía estaba rechazando la codificación url. Creo que terminé con un esquema de sustitución de lugar, pero esto fue en un tiempo un ir, así que estoy un poco confusa.

    OriginalEl autor Toolkit

Dejar respuesta

Please enter your comment!
Please enter your name here