2010-08-31 5 views
13

J'ai une application ASP.NET 3.5 simple exécutée sous IIS7 sous un répertoire virtuel. Donc, l'URL de mon application est comme http://example.com/app. Je souhaite rediriger 301 la demande vers example.com/app/default.aspx vers example.com/app pour un meilleur référencement. Je dois faire cette redirection par le code seulement, pas par les paramètres IIS. Je suis incapable de le faire via le code mentionné dans cet article:Redirection de default.aspx vers le répertoire virtuel racine

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

Le code:

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); 
} 

semble aller dans une boucle infinie lorsque l'application est dans un répertoire virtuel. La propriété request.RawUrl renvoie toujours "/default.aspx" même après une redirection 301 provoquant la boucle infinie. Comment puis-je résoudre ce problème?

grâce,

Asif

Répondre

2

Le code ci-dessus fonctionnera correctement tant que vous n'avez pas de sous-répertoire. AFAIK, c'est un bug dans ASP.NET: le Request.RawUrl ne doit pas contenir "/default.aspx" quand l'URL n'a pas cette extension. J'ai testé votre code et il fonctionne correctement sans un sous-répertoire, mais si default.aspx est sous un répertoire, l'objet Request.RawUrl ne parvient pas à se débarrasser de default.aspx et donc de la boucle infinie.

0

Puisque vous utilisez IIS7, essayez ceci:

<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> 

Ceci est juste un exemple rapide, vous pouvez le modifier en fonction de vos besoins. J'espère que cela t'aides!

+0

En fait, je ne peux pas le faire via IIS7, je dois le faire en utilisant le code lui-même. – AsifQadri

1

Légères modifications pour gérer les sous-répertoires et gérer les variables d'URL. Une meilleure comparaison et remplacer la fonctionnalité existe probablement, mais cela fonctionne pour moi avec 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

J'ai essayé la méthode de réécriture d'URL. C'est à dire. celui-ci:

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

mais il a envoyé mon navigateur dans une boucle de redirection infinie. Je l'ai modifié de façon à ce qui suit et il a bien fonctionné:

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

Utilisez ce code dans votre page 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

N'utilisez pas cette méthode. Si vous redirigez avec JavaScript, les moteurs de recherche n'acceptent pas les modifications. – NickG

0

Cela a fonctionné pour moi. En utilisant le lien ci-dessus, j'ai écrit les lignes suivantes et il a exécuté sans aucun problème. Notez qu'il n'y a pas de point-virgule à la fin. Ma page default.aspx contient juste les trois lignes suivantes.

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

La raison possible est; En général, la langue est mentionnée en haut des pages .aspx ou dans le fichier web.config. Si la langue n'est pas mentionnée, IIS utilise VB.NET pour compiler les pages et nous savons que VB.NET n'utilise pas de point-virgule pour terminer les instructions.

Questions connexes