2010-08-31 17 views
13

Tengo una aplicación ASP.NET 3.5 simple que se ejecuta bajo IIS7 bajo un directorio virtual. Entonces, la URL de mi aplicación es como http://example.com/app. Quiero 301-redirigir la solicitud a example.com/app/default.aspx a example.com/app para un mejor SEO. Tengo que hacer esto redirigir solo por código, no por ninguna configuración de IIS. Soy incapaz de hacerlo a través de código mencionado en este artículo:Redirigir default.aspx al directorio virtual raíz

http://www.4guysfromrolla.com/articles/072810-1.aspx

El código:

if (request.RawUrl.Equals("/default.aspx")) 
{ 
newUrl = string.Format("{0}://{1}{2}", 
       request.Url.Scheme, 
       request.Url.Authority, 
       request.RawUrl.Remove(request.RawUrl.LastIndexOf("/default.aspx", StringComparison.OrdinalIgnoreCase))); 

       context.Response.Status = "301 moved permanently"; 
       context.Response.AddHeader("Location", newUrl); 
} 

parece ir en un bucle infinito cuando la aplicación está en un directorio virtual. la propiedad request.RawUrl siempre devuelve "/default.aspx" incluso después de una redirección 301 que causa el bucle infinito. ¿Cómo puedo solucionar este problema?

gracias,

Asif

Respuesta

2

El código anterior funcionará bien siempre que no tenga un subdirectorio. AFAIK, es un error en ASP.NET: Request.RawUrl NO debe contener "/default.aspx" cuando la URL no tiene esa extensión. He probado su código y funciona bien sin un subdirectorio, pero si default.aspx está bajo un directorio, el objeto Request.RawUrl no puede deshacerse de default.aspx y, por lo tanto, del bucle infinito.

0

Puesto que se utiliza IIS7, intente esto:

<configuration> 
    <system.webServer> 
    <rewrite> 
     <rules> 
     <rule name="default page" stopProcessing="true"> 
      <match url="^default\.aspx$" /> 
      <action type="Redirect" url="{R:0}" redirectType="Permanent" /> 
     </rule> 
     </rules> 
    </rewrite> 
    </system.webServer> 
</configuration> 

Esto es sólo un ejemplo rápido, puede modificarlo para adaptarlo a sus necesidades. ¡Espero que esto ayude!

+0

En realidad no puedo hacerlo a través de IIS7, tengo que hacerlo usando el código en sí. – AsifQadri

1

Ligeras modificaciones para manejar subdirectorios y mantener variables de url. Mejor comparación y reemplazar la funcionalidad probablemente existe, pero esto funciona para mí con IIS 7.

if (Request.RawUrl.ToLower().Contains("/default.aspx")) // use Contains instead of EndsWith to handle url vars 
{ 
    string newUrl = string.Format("{0}://{1}{2}", 
        Request.Url.Scheme, 
        Request.Url.Authority, 
        Request.RawUrl.ToLower().Replace("default.aspx", "")); // don't remove the trailing slash so url vars are maintained 

    Response.Clear(); 
    Response.Status = "301 Moved Permanently"; 
    Response.AddHeader("Location", newUrl); 
    Response.End(); 
} 
1

Probé el método de reescritura de URL. Es decir. este:

<rule name="default page" stopProcessing="true"> 
     <match url="^default\.aspx$" /> 
     <action type="Redirect" url="{R:0}" redirectType="Permanent" /> 
    </rule> 

pero envió mi navegador en un bucle infinito de redirección. I modificado a la siguiente y funcionó bien:

  <rule name="default page" stopProcessing="true"> 
       <match url="(.*)default.aspx$" /> 
       <action type="Redirect" url="{R:1}" redirectType="Permanent" /> 
      </rule> 
-1

Utilice este código en su página default.aspx

<script language="javascript"> 
var url=location.href; 
if (url.toLowerCase()=="http://www.doamin.com/default.aspx" || url.toLowerCase()=="http://www.doamin.com/#") { 
window.location= "http://www.doamin.com"; 
} 

</script> 
+0

No use este método. Si redirige a JavaScript, los motores de búsqueda no recogen los cambios. – NickG

0

Esto funcionó para mí. http://www.w3schools.com/asp/met_redirect.asp

Usando el enlace de arriba, escribí las siguientes líneas y se ejecutó sin ningún problema. Observe que no hay punto y coma al final. Mi página default.aspx solo contiene las siguientes tres líneas.

<% 
    Response.Redirect("~/portal") 
%> 

Posible razón es; por lo general, el idioma se menciona en la parte superior de las páginas .aspx o en el archivo web.config. Si no se menciona el idioma, IIS utiliza VB.NET para compilar las páginas y sabemos que VB.NET no utiliza punto y coma para finalizar las instrucciones.

Cuestiones relacionadas