- 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). <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. 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. <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. <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. <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).
|
|||
<< INDIETRO | by VeNoM00 |