URL Rewrite con IIS 7

Il pannello di IIS7 ci permette di riscrivere gli URL delle pagine di un sito web con una certa facilità. E' possibile impostare la riscrittura degli indirizzi sia di pagine PHP che Asp.Net (.aspx) e di altri formati come .html.
Prima di procedere vi consiglio di leggere il precedente articolo in cui viene spiegato cos'è l'Url Rewriting e quali vantaggi offre.

URL Rewrite su Aruba

E' possibile applicare la tecnica dell'URL Rewrite anche su siti ospitati da Aruba. Un esempio vivente è proprio il sito che state visitando in questo momento. Per farlo è prima necessario collegarsi al sito in remoto mediante IIS.

Chi vuole avere il modulo in locale per fare dei test può scaricarlo direttamente dal sito della Microsoft.

Aggiungere una regola Rewrite

Per prima cosa lanciare IIS7, espandere l'albero a sinistra e selezionare il sito o la sottocartella del sito su cui si desidera operare. Una regola creata sulla cartella root viene applicata a tutto il sito.

Poi fare doppio click sul modulo URL Rewrite che si trova nel pannello centrale. In questo modo si viene proiettati nell'elenco delle regole create. Le regole vengono eseguite nell'ordine in cui appaiono, è ovviamente possibile spostarle.

Per aggiungere una regola cliccare Add Rule(s) nel pannello a destra, selezionare il tipo di regola e dare OK.

Ottenere URLs semplici

Per semplificare gli indirizzi di una pagina, ad esempio rimuovendo il nome del file fisico sul server (.aspx, .php. ecc) bisogna aggiungere una regola di tipo User-friendly URLs.

IIS >> URL Rewrite >> Add rules >> User-friendly URL

Nel primo campo si inserisce l'indirizzo vero della pagina, e nella seconda tendina possiamo scegliere uno tra i vari formati di indirizzi che ci vengono proposti da IIS.

E' consigliabile selezionare la voce "Create corresponding redirect Url" per aver un redirect automatico dagli Url fisici a quelli riscritti, così digitando ad esempio articoli.aspx si viene dirottati al nuovo indirizzo /articoli.

La terza opzione "Create corresponding outbound rewrite rule" è interessante: con questa opzione attiva, tutti gli indirizzi fisici presenti nella pagina html restituita al browser vengono sostituiti con gli indirizzi riscritti. E' comodo perché in questo modo possiamo tenere gli Url tradizionali nella pagine, ad esempio da usare nel sito in locale per sviluppo, senza preoccuparci di dover generare gli Url già riscritti quando il sito è online. Purtroppo questa opzione non è utilizzabile su siti hostati da Aruba in quanto è attiva la compressione dinamica.

Creando una regola per ogni pagina del sito si ottiene in pochi click un risultato soddisfacente senza dover  conoscere le espressioni regolari. Questo può essere sufficiente per la maggior parte dei siti, ma IIS offre tante altre funzionalità di rewriting.

Rewrite statico

Il Rewrite statico consente di creare una sorta di redirect da un url specifico ad un altro. Si può usare ad esempio se abbiamo una pagina chiamata old.aspx non più presente nel sito e vogliamo che i visitatori vengano indirizzati verso la pagina new.aspx in modo che sia i motori di ricerca sia i visitatori che hanno la pagina salvata nei preferiti non ottenganno mai errore di pagina non trovata. Una pagina non trovata non solo compromette l'esperienza del visitatore del sito, ma anche il posizionamento nei motori di ricerca.

Per creare la regola di tipo Static Rewrite:

IIS >> URL Rewrite >> Add Rule(s) >> Rule with rewrite map

Action: Rewrite (leggere le note per conoscere le differenze tra rewrite e redirect)
Select rewrite map: un nome per identificare la regola. Digitarne uno nuovo o selezionare uno già esistente

Poi sulla destra selezionare Add Mapping Entry per aggiungere le varie regole:
Original Value: indirizzo vecchio, es. /oldcontent/doc1.html
New Value: indirizzo nuovo, es. /articolo.aspx?id=1

Infine Back to rewrite Map /Rules

Atri tipi di regole Rewrite

Questi sono due tipi di regole standard proposte da IIS:

  • Enforce lower case: forza tutti gli indirizzi del sito in minuscolo. Nonostante i web server Microsoft non sono case-sensitive, i motori di ricerca invece lo sono quindi per loro Default.asp è una pagina diversa da default.aspx
  •  Trailing slash: questa regola permette di definire uno standard per avere o meno il forward slash (/) dopo gli indirizzi

Selezionando Import Rules è possibile importare le regole di rewriting da un file di configurazione di Apache (mod_rewrite).

Bloccare richieste indesiderate

Può capitare di voler bloccare un webcrawler indesiderato. Ad esempio si può voler escludere certi motori di ricerca che generano traffico dati inutile, oppure bloccare le richieste provenienti da programmi come HTTrack che cercano di scaricare l'intero sito. Un modo per ottenere questo risultato è creare una regola di tipo pattern.
Si crea prima una regola vuota:

IIS >>Add Rule(s) >> Blank Rule

Poi si impostano questi valori:

  • Name: Block bad crawler (un nome significativo di nostra scelta)
  • Using: Wildcards
  • Pattern: * (significa che si applica all'intero sito)
  • Cliccare su Add conditions >> Add
  • Input: {HTTP_USER_AGENT}
  • Pattern: nome del crawler da bloccare
  • Action type: Abort Request
  • Apply >> Back to Rules

Poi portiamo la regola in cima alle altre regole.

Infine possiamo usare il programma WFetch per testare l'accesso al sito tramite uno user agent di prova per verificare il funzionamento della regola appena creata. Come si vede dall'immagine, la richiesta effettuata dallo user agent BadCrawler viene rifiutata.

File di configurazione

I più audaci possono creare o modificare le regole di Rewriting manualmente scrivendo l'opportuno codice xml nel file di configurazione web.config della cartella del sito su cui si vuole agire.
L'interfaccia visuale non fa altro che generare e scrivere il codice per noi risparmiandoci la fatica.

Ecco un esempio di codice generato per Dev-oClock: si forzano gli Url in minuscolo e si sostituisce la pagina about.aspx con /about

<system.webServer>
	<rewrite>
		<rules>
			<clear />
			<rule name="LowerCaseRule1" stopProcessing="true">
				<match url="[A-Z]" ignoreCase="false" />
				<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
				<action type="Redirect" url="{ToLower:{URL}}" />
			</rule>
			<rule name="About_redirect" stopProcessing="true">
				<match url="^about\.aspx$" />
				<conditions>
					<add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
				</conditions>
				<action type="Redirect" url="about" appendQueryString="false" />
			</rule>
			<rule name="About_rewrite" stopProcessing="true">
				<match url="^about$" />
				<conditions>
					<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
					<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
				</conditions>
				<action type="Rewrite" url="about.aspx" />
			</rule>
		</rules>
	</rewrite>
</system.webServer>

Autore: Sergio Roberto Boarina