2010-08-31 7 views
13

Ho una semplice applicazione ASP.NET 3.5 in esecuzione su IIS7 in una directory virtuale. Quindi l'URL della mia app è come http://example.com/app. Voglio reindirizzare la richiesta a example.com/app/default.aspx all'indirizzo example.com/app per un migliore SEO. Devo fare questo reindirizzamento solo attraverso il codice, non da eventuali impostazioni di IIS. Sono in grado di farlo tramite codice di cui al presente articolo:Reindirizzamento di default.aspx alla directory virtuale root

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

Il codice:

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

sembra entrare in un ciclo infinito quando l'applicazione è in una directory virtuale. la proprietà request.RawUrl restituisce sempre "/default.aspx" anche dopo un reindirizzamento 301 che causa il ciclo infinito. Come posso risolvere questo problema?

grazie,

Asif

risposta

2

Il codice sopra funzionerà correttamente fino a quando non si dispone di una sottodirectory. AFAIK, è un bug in ASP.NET: il Request.RawUrl NON deve contenere "/default.aspx" quando l'URL non ha quell'estensione. Ho testato il tuo codice e funziona senza una sottodirectory, ma se default.aspx si trova in una directory, l'oggetto Request.RawUrl non riesce a eliminare default.aspx e quindi il ciclo infinito.

0

Dal momento che si utilizza IIS7, provate questo:

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

Questo è solo un esempio veloce, è possibile modificarlo in base alle proprie necessità. Spero che questo ti aiuti!

+0

In realtà non posso farlo tramite IIS7, devo farlo usando il codice stesso. – AsifQadri

1

Leggende modifiche per gestire le sottodirectory e mantenere le variabili url. Probabilmente esiste una migliore funzionalità di confronto e sostituzione, ma questo funziona 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

Ho provato il metodo di riscrittura dell'URL. Cioè questo:

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

ma ha inviato il mio browser in un ciclo di reindirizzamento infinito. Ho modificato al seguente ed ha funzionato benissimo:

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

Utilizzare questo codice nella tua pagina 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

Non utilizzare questo metodo. Se si reindirizza con JavaScript, i motori di ricerca non rilevano le modifiche. – NickG

0

Questo ha funzionato per me. http://www.w3schools.com/asp/met_redirect.asp

Utilizzando il collegamento precedente, ho scritto le seguenti righe ed è stato eseguito senza alcun problema. Si noti che non vi è alcun punto e virgola alla fine. La mia pagina default.aspx contiene solo le seguenti tre righe.

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

Possibile causa; di solito la lingua è menzionata nella parte superiore delle pagine .aspx o nel file web.config. Se la lingua non viene menzionata, IIS utilizza VB.NET per compilare le pagine e sappiamo che VB.NET non utilizza il punto e virgola per terminare le istruzioni.