Pregunta

Hemos rediseñado la estructura a un sitio web que cuenta con varias unidades de negocio.Ahora quiero redirigir (301) a la nueva página.

ES DECIR:
era www.ejemplo.com/abc
ahora www.example.com/default.aspx?article=abc

Intenté usar Global.asax para hacer esto y funciona correctamente cuando lo depuro.

        if (Request.RawUrl.Contains("abc"))
        {
            Response.RedirectLocation = "/default.aspx?article=abc";
            Response.StatusCode = 301;
            Response.StatusDescription = "Moved";
            Response.End();
        }

Entonces http://localhost:1234/ejemplo/abc redirige correctamente, pero (donde 1234 es el puerto para el servidor de depuración)
http://localhost/ejemplo/abc no redirige, me da un 404.

¿Algunas ideas?


Información adicional:Si voy a http://localhost/ejemplo/abc/default.aspx luego redirige correctamente.

¿Fue útil?

Solución

Bueno, si el puerto indica que estás usando el servidor web integrado (el que viene con VS), probablemente esto funcione porque siempre enruta las solicitudes a través del marco ASP.NET.

Las solicitudes que terminan en /abc no se enrutarán automáticamente a través del marco ASP.NET porque es posible que IIS no "sepa" que usted desea que lo hagan.Debe verificar la configuración de IIS para asegurarse de que dichas solicitudes se enruten a aspnet_isapi.dll


EDITAR: Para lograr esto, es necesario agregar un mapeo con comodines:

  1. En el Administrador de IIS, expanda la computadora local, expanda la carpeta Sitios web, haga clic con el botón derecho en el sitio web o directorio virtual que desee y luego haga clic en Propiedades.
  2. Haga clic en la pestaña correspondiente:Directorio de inicio, directorio virtual o directorio.
  3. En el área de configuración de la aplicación, haga clic en Configuración y luego haga clic en la pestaña Asignaciones.
  4. Para instalar un mapa de aplicación comodín, haga lo siguiente:
    • En la pestaña Asignaciones, haga clic en Agregar o Insertar.
    • Escriba la ruta a la DLL en el cuadro de texto Ejecutable o haga clic en Examinar para navegar hasta ella (por ejemplo, la dll de ASP.NET 2.0 está en c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll en mi máquina)
    • Para la extensión, utilice ".*" sin comillas, por supuesto.
    • Selecciona qué verbos quieres buscar (GET,HEAD,POST,DEBUG son los habituales para ASP.NET, tú decides)
    • Asegúrese de que esté seleccionado "Motor de secuencias de comandos" o "Motor de aplicaciones"
    • Desmarque "Comprobar que el archivo existe"
    • Haga clic en Aceptar.

Puede que esté equivocado en esto, pero si lo estoy, espero que alguien me corrija.:)

Otros consejos

Debería utilizar la redirección comodín de IIS; necesitará algo como esto;

 *; www.example.com/*; www.example.com/default.aspx?article=$0

Hay una referencia razonable en microsoft

Si estás usando Apache, creo que necesitarás modificar el archivo htaccess.

¿Está probando actualmente el sitio en el servidor web de Visual Studio?Por lo general, esto ejecuta el sitio en "localhost:nnnnn", donde "nnnnn" es un número de puerto (como el anterior es 1234), no lo configura para que se ejecute sin uno.

Si tiene IIS instalado en la máquina en cuestión, publique su proyecto en ella y debería poder verificar que funciona sin "nnnnn", ya que no parece haber nada en su código que pueda causar que no funcione. hazlo.

¿Se ha asegurado de que los archivos web.config sean los mismos para cada sitio web (asumiendo que :1234 es diferente a :80)?

Además, ¿has probado localhost:80?

Su http://localhost/ejemplo/abc no está invocando Global.asax como esperaba.Típicamente http://localhost se ejecuta en el puerto 80 (:80).Si desea ejecutar su sitio en el puerto 80, deberá implementar su sitio en IIS para ejecutarlo aquí.

Debe configurar una asignación de controlador en IIS para reenviar todas las extensiones desconocidas a asp.net.El primero funciona porque Cassini maneja todas las solicitudes, el segundo no funciona porque IIS está buscando ese directorio y no existe, en lugar de que .net framework ejecute el código que tiene.

Aquí tienes información sobre cómo hacerlo. Reescritura de URL en asp.net.

Sin embargo, si es posible, sugeriría usar el nuevo Enrutamiento de solicitudes de aplicaciones o URLRewrite.net

IIS, de forma predeterminada, no entrega todas las solicitudes a ASP.NET para su manejo.Sólo algunas extensiones de recursos, entre ellas "aspx", se pasarán a asp.net para su manipulación.¿Qué sucede cuando solicitas? http://localhost/ejemplo/abc es que IIS intenta localizar el directorio para ver si tiene un archivo predeterminado (es decir,default.aspx, index.html) para cargar desde ese directorio.Como no puede encontrar el directorio con la etiqueta basura "abc", nunca encuentra el archivo default.aspx para cargar.

Cuando intentas cargar http://localhost/ejemplo/abc/default.aspx, IIS ve la extensión "aspx" e inmediatamente la entrega al tiempo de ejecución de ASP.NET para su manejo.La razón por la que el http://localhost/ejemplo/abc La solicitud no se carga es que nunca se entrega a ASP.NET, por lo que, por supuesto, global.asax nunca la ve.

El sitio alojado en Cassini maneja todas las solicitudes, por lo que ASP.NET y el archivo global.asax manejan esa llamada.

Estoy de acuerdo con Darren Kopp, quien sugirió que es necesario configurar el mapeo de controladores en IIS para reenviar extensiones desconocidas a ASP.NET.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top