- URL rewrite in ASP .Net -
 
COSA SERVE PER QUESTO TUTORIAL
Download | Chiedi sul FORUM | Glossario IIS 5 o superiori con ASP .Net installato
Riscrittura degli URL in IIS 5, 6 e 7 in maniera semplice e su tutti i tipi di richieste

COS'È L'URL REWRITING E QUALI SONO LE SOLUZIONI POSSIBILI
Lo scopo della riscrittura degli URL e le possibilità integrate da ASP .Net 2.0

Per URL rewriting si intende una forma di redirect di una richiesta ricevuta dal server verso un nuovo URL in maniera invisibile all'utente, ovvero senza mandare responsi contenti redirect JavaScript, HTTP (responsi 300 e successivi), o tramite META ma bensì restituendo direttamente il contenuto della pagina di destinazione. Questa tecnica è molto utile per vari aspetti. L'ipotesi più semplice è quella di voler associare ad una stessa risorsa più percorsi, ad esempio ad un'immagine che si trova fisicamente in /immagini/miaImmagine.JPG potrebbe risultare necessario associare anche il percorso /altraLingua/immagini/miaImmagine.JPG evitando un redirect al browser e rendendo il tutto più pulito (anche agli occhi dei motori di ricerca). Un'altra esigenza potrebbe essere invece quella di interpretare richieste a risorse che non hanno una vera e propria corrispondenza con un file come accade ad esempio per una discussione di un FORUM; in sostanza tramite l'URL rewriting è possibile associare ad una richiesta del tipo /forum/Titolo-della-discussione-1234.htm la pagina /forum/Discussione.aspx?id=1234. Anche in questo caso si tratta di una miglioria rivolta ai motori di ricerca che danno una certa importanza ai nomi delle risorse e in taluni casi apprezzano maggiormente le pagine (almeno apparentemente) statiche (quindi con estensione HTML e privi di parametri).
Le soluzioni sono varie e richiedono livelli diversi di accesso al server. ASP .Net 2.0 offre un metodo integrato per riscrivere gli URL davvero rudimentale, in realtà semplicemente limitato a riscrivere l'URL di una richiesta verso un'altra, senza la possibilità di impostare filtri avanzati. Vediamo comunque questa soluzione perché è l'unica che non richiede di scrivere codice o di servirsi di librerie di terze parti. Si tratta in sostanza di servirsi dell'elemento urlMappings all'interno della sezione system.web nel file web.config:


<configuration>
    <system.web>
        <urlMappings enabled="true">
            <add url="~/forum/Titolo-della-discussione-1234.htm" 
                mappedUrl="~/forum/Discussione.aspx?id=1234" />
        </urlMappings>
    </system.web>
</configuration>

Nota: tutte le modifiche al file web.config proposte in questo articolo sono da considerarsi come incrementali alle sezioni già esistenti, ad esempio se è già presente un elemento system.web non bisogna crearne un altro per urlMappings (come visto nell'esempio sopra) ma semplicemente inserire quest'ultimo all'interno della sezione preesistente.

Come è evidente questa soluzione non è molto utile in quanto si è obbligati a specificare l'ID di ogni singola discussione, mentre sarebbe molto più utile che in automatico fosse effettuato un redirect verso la pagina Discussione.aspx con l'ID specificato nell'URL originale. Per fare questo ci serviremo di una libreria di terze parti gratuita, che sfrutta le espressioni regolari (regular expressions), completamente basata su ASP .Net e che non richiede in alcun modo accesso diretto al pannello di configurazione di IIS (ma solamente al file web.config, quindi particolarmente adatto in caso di hosting condiviso), tuttavia bisogna fare una nota importante.

COME UTILIZZARE ASP .NET PER GESTIRE TUTTE LE ESTENSIONI
Procedimento per configurare IIS 5, 6 e 7 per far gestire tutte le richieste ad ASP .Net.

ASP .Net è agli occhi di IIS (almeno fino alla versione 7 e anche nella 7 se si utilizza la modalità classica) un gestore di una certa tipologia di pagine (ASPX e altre), niente di più. Ciò significa che ASP .Net, normalmente, non è coinvolto nell'elaborazione delle richieste a pagine con estensione diversa da ASPX e quindi neppure il file web.config, risultato: le riscritture degli URL non funzionano su richieste verso pagine non ASPX (indipendentemente dal fatto che il file esista realmente o meno). Per ovviare a questo inconveniente è possibile installare un'estensione ISAPI apposita per IIS per la riscrittura degli URL, pratica comunque meno versatile. Per far sì che ASP .Net serva tutti i tipi di richiesto, purtroppo, è necessario agire direttamente sul pannello di configurazione di IIS, vediamo come fare su IIS 7 e precedenti.
Sotto IIS 7, andare sul Pannello di controllo, Strumenti di amministrazione, Gestione Internet Information Services (IIS) e selezionare il sito in questione. Per prima cosa bisogna verificare di star utilizzando il tipo di pool di applicazioni in uso: sul lato destro cliccare su Impostazioni di base e verificare la voce Pool di applicazioni. Se non si utilizza la modalità Classic .NET AppPool (o comunque un'altra modalità pipeline non integrata) il problema descritto non sussiste in quanto ci si sta servendo della modalità a pipeline integrata, nella quale ASP .Net è integrato strettamente con IIS e gestisce in automatico tutte le richieste. Se possibile conviene cambiare il pool di applicazioni verso la nuova modalità (in genere chiamata DefaultAppPool); se ci si trova in un hosting condiviso informarsi su quale tipo di pool di applicazioni è in uso.
Nel caso non sia possibile cambiare il tipo di pool di applicazioni o si debba rimanere in modalità classica per questioni di compatibilità, fare doppio click su Mapping Gestori, fare doppio click sulla voce che nella colonna Percorso riporta *.aspx, quindi nel campo Percorso richiesta scrivere semplicemente * per indicare che ASP .Net deve occuparsi di tutte le richieste oppure creare più voci identiche per ogni estensione che si desidera gestire. Nella stessa finestra cliccare su Restrizioni richieste e nel tab Mapping deselezionare la casella Richiama gestore solo se la richiesta è mappata a, nel tab Verbi selezionare Tutti i verbi e nel tab Accesso selezionare Nessuna. A questo punto nel file web.config (che potete trovare nella cartella principale del sito) dovrebbe venire aggiunto in automatico qualcosa di simile a quanto segue:


<configuration>
    <system.webServer>
        <handlers>
            <remove name="PageHandlerFactory-ISAPI-2.0" />
            <add name="PageHandlerFactory-ISAPI-2.0" path="*" 
                verb="*" modules="IsapiModule" 
                scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" 
                resourceType="Unspecified" requireAccess="None" 
                preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
        </handlers>
    </system.webServer>
</configuration>

Per le versioni precedenti di IIS invece raggiungere il Pannello di controllo, Strumenti di amministrazione, Internet Information Services, selezionare il sito in questione, menu Azione, Proprietà, tab Home directory e nella sezione Impostazioni applicazione cliccare su Configurazione. Nel tab Mapping della finestra che apparirà, individuare nella lista la voce .aspx, cliccare su Modifica, copiare negli appunti il testo del campo Eseguibile, premere Annulla, poi Aggiungi: nel campo Eseguibile incollare quanto copiato in precedenza e nel campo Estensione specificare .* (ovvero tutti i file), impostare Tutti i verbi e assicurarsi che la casella Verifica l'esistenza dei file sia disattivata, quindi dare conferma. Questo dovrebbe essere sufficiente.
Dopo questa modifica è raccomandabile verificare che tutti i tipi di richieste funzionino correttamente (in particolare i file statici come le immagini).
A questo punto non resta che vedere un ulteriore passo opzionale, ovvero abilitare l'uso dei file HTML come fossero ASPX; questo non è obbligatorio e neppure strettamente correlato con la tecnica di URL Rewriting ma può risultare utile pertanto vediamo come fare. Indipendentemente dalla versione di IIS in uso, se si sta usando la versione del framework .Net 1.1 è sufficiente modificare web.config come segue:


<configuration>
    <system.web>
        <httpHandlers>
            <add verb="*" path="*.htm" type="System.Web.UI.PageHandlerFactory" />
        </httpHandlers>
    </system.web>
</configuration>

Per le versioni successive di .Net invece è necessario specificare anche un BuildProvider:


<configuration>
    <system.web>
        <httpHandlers>
            <add verb="*" path="*.htm" type="System.Web.UI.PageHandlerFactory" />
        </httpHandlers>
        <compilation>
            <buildProviders>
                <add extension=".htm" type="System.Web.Compilation.PageBuildProvider" />
            </buildProviders>
        </compilation>
    </system.web>
</configuration>

UNA LIBRERIA PER RISCRIVERE GLI URL TRAMITE UN MODULO HTTP
Un semplice esempio di utilizzo di una libreria per la riscrittura degli URL, semplice e potente.

Arriviamo finalmente al cuore del problema: l'URL rewriting. Esistono varie librerie disponibili che permettono la riscrittura di URL, alcune che si pongono come httpHandler, altre come httpModule e altre che offrono entrambe le possibilità. Noi ci occuperemo in particolare del modulo HTTP UrlRewriter.Net. I moduli hanno infatti il vantaggio di essere del tutto indipendenti dal tipo di richiesta (non importa che si tratti di una risorsa statica come un'immagine, dinamica come una pagina ASPX o di un webservice) e risolve tutti i problemi che ne conseguono alla radice. Configurare la libreria non è complesso e coinvolge principalmente il file web.config.
Per prima cosa scaricare dal sito ufficiale la DLL per la vostra versione del framework .Net (attualmente sono disponibili per .Net 1.1 e .Net 2.0), quindi estrarre dall'archivio la DLL che si trova in /bin/Release e copiarla nella cartella /Bin del sito. Ora non resta che apportare tre piccole modifiche a web.config per rendere operativo il tutto: aggiungere la libreria come httpModule, aggiungere un riferimento al gestore della configurazione della libreria (cosicché ASP .Net sia in grado di interpretare la sezione di configurazione del riscrittore di URL) e aggiungere la configurazione vera e propria, dove cioè potremo specificare le regole di riscrittura degli URL.


<configuration>
    <configSections>
        <section name="rewriter" 
            type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, 
            Intelligencia.UrlRewriter" />
    </configSections>
    <system.web>
        <httpModules>
            <add type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" 
                name="UrlRewriter" />
        </httpModules>
    </system.web>
    <rewriter>
        <rewrite url="/forum/.*-([0-9]+).htm" to="/forum/Discussione.aspx?id=$1" />
    </rewriter>
</configuration>

Vediamo in particolare l'ultima sezione, rewriter; essa può contenere diversi elementi rewrite che permettono di specificare un'espressione regolare con l'URL da filtrare (attributo url) e come deve essere rimpiazzato (attributo to), ovvero come deve essere riscritto. Come si può vedere "$1" fa riferimento all'ultima sequenza di cifre (catturata con "([0-9]+)") e quindi la regola indica che tutti le richieste verso la cartella forum, che finiscano con un numero seguito dall'estensione HTM siano reindirizzate alla pagina /forum/Discussione.aspx con parametro id uguale a quel numero (questo significa che quello che dovrebbe essere il titolo della discussione potrebbe essere anche non corrispondente a quello reale).
Ecco ottenuto il risultato desiderato.

 

<< INDIETRO by VeNoM00