Domanda

Abbiamo ridisegnato la struttura in un sito Web che ha diverse unità aziendali. Ora voglio reindirizzare (301) alla nuova pagina.

IE:
era www.example.com/abc
ora www.example.com/default.aspx?article=abc

Ho provato a usare Global.asax per farlo, e funziona correttamente quando eseguo il debug attraverso di esso.

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

Quindi http: // localhost: 1234 / example / abc reindirizza correttamente, ma (dove 1234 è la porta per il server di debug)
http: // localhost / example / abc non reindirizza, mi dà un 404.

Qualche idea?


Informazioni aggiuntive: Se vado a http: //localhost/example/abc/default.aspx reindirizza correttamente.

È stato utile?

Soluzione

Bene, se la porta indica che stai usando il web server integrato (quello che viene fornito con VS), questo probabilmente funziona perché sempre instrada le richieste attraverso il framework ASP.NET.

Le richieste che terminano con / abc non verranno automaticamente instradate attraverso il framework ASP.NET perché IIS potrebbe non " conoscere " lo vuoi tu. È necessario controllare le impostazioni IIS per assicurarsi che tali richieste vengano instradate verso aspnet_isapi.dll


MODIFICA: per farlo, è necessario aggiungere un mappatura jolly :

  1. In Gestione IIS, espandere il computer locale, espandere la cartella Siti Web, fare clic con il pulsante destro del mouse sul sito Web o sulla directory virtuale desiderati, quindi fare clic su Proprietà.
  2. Fai clic sulla scheda appropriata: Directory principale, Directory virtuale o Directory.
  3. Nell'area Impostazioni applicazione, fare clic su Configurazione, quindi sulla scheda Mappature.
  4. Per installare una mappa di applicazioni jolly, procedi come segue
    • Nella scheda Mappature, fai clic su Aggiungi o Inserisci.
    • Digitare il percorso della DLL nella casella di testo Eseguibile o fare clic su Sfoglia per navigare (ad esempio, la dll ASP.NET 2.0 è in c: \ windows \ microsoft.net \ framework \ v2.0.50727 \ aspnet_isapi. dll sulla mia macchina)
    • Per l'estensione, utilizzare ". * " senza virgolette, ovviamente
    • Seleziona i verbi che vuoi cercare (GET, HEAD, POST, DEBUG sono i soliti per ASP.NET, decidi)
    • Assicurati di " Motore di script " o " Motore di applicazione " è selezionato
    • Deseleziona " Verifica che il file esista "
    • Fai clic su OK.

Potrei essere fuori su questo, ma se lo sono, spero che qualcuno mi corregga. :)

Altri suggerimenti

Dovresti usare il reindirizzamento dei caratteri jolly IIS, avrai bisogno di qualcosa del genere;

 *; www.example.com/*; www.example.com/default.aspx?article=<*>

Esiste un riferimento ragionevole in Microsoft

Se stai usando Apache penso che dovrai modificare il file htaccess.

Stai attualmente testando il sito nel server Web di Visual Studio? Che di solito esegue il sito su " localhost: nnnnn " dove " nnnnn " è un numero di porta (come sopra è 1234), non lo imposta per funzionare senza uno.

Se hai IIS installato sulla macchina in questione, pubblica il tuo progetto su di esso e dovresti essere in grado di verificare che funzioni senza " nnnnn " poiché non sembra esserci nulla nel tuo codice che non lo farebbe.

Ti sei assicurato che i file web.config siano gli stessi per ogni sito Web (supponendo che 1234 sia diverso da: 80)

Inoltre, hai provato localhost: 80?

Il tuo http: // localhost / example / abc non sta invocando il Global.asax come ti aspetti. In genere http: // localhost è in esecuzione sulla porta 80 (: 80). Se si desidera eseguire il sito sulla porta 80, è necessario distribuire il sito in IIS per l'esecuzione qui.

È necessario impostare una mappatura del gestore in IIS per inoltrare tutte le estensioni sconosciute ad asp.net. Il primo funziona perché Cassini sta gestendo tutte le richieste, il secondo non funziona perché IIS sta cercando quella directory e non esiste, al posto del framework .net che esegue il codice che hai.

Ecco informazioni su come eseguire Riscrittura URL in asp.net .

Se possibile, suggerirei di utilizzare il nuovo Routing richieste applicazione o < a href = "http://www.urlrewriting.net/149/en/home.html" rel = "nofollow noreferrer"> UrlRewrite.net

IIS, per impostazione predefinita, non consegna tutte le richieste ad ASP.NET per la gestione. Solo alcune estensioni di risorse, tra cui "aspx" verrà passato ad asp.net per la gestione. Quello che sta succedendo quando si richiede http: // localhost / example / abc è che IIS tenta di individuare la directory per vedere se si dispone di un file predefinito (ovvero default.aspx, index.html) da caricare da quella directory. Dato che non riesce a trovare la directory con la spazzatura " abc " tag al suo interno, non trova mai il file default.aspx da caricare.

Quando si tenta di caricare http: //localhost/example/abc/default.aspx , IIS vede " aspx " estensione e lo passa immediatamente al runtime ASP.NET per la gestione. Il motivo per cui la http: // localhost / example / abc non viene caricata è che non viene mai consegnata su ASP.NET, quindi ovviamente global.asax non lo vede mai.

Il sito ospitato da Cassini gestisce tutte le richieste, quindi quella chiamata viene gestita da ASP.NET e dal file global.asax.

Sono d'accordo con Darren Kopp, che ha suggerito la necessità di impostare il mapping dei gestori in IIS per inoltrare estensioni sconosciute ad ASP.NET.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top