Creazione di regole di riscrittura per il modulo di riscrittura URL

di Ruslan Yakushev

Il modulo di riscrittura URL è un'estensione di IIS disponibile come download per il server IIS autonomo e viene preinstallato anche in qualsiasi sito Web in Siti Web di Windows Azure (WAWS) e disponibile per l'uso. Questa procedura dettagliata illustra come creare e testare un set di regole di riscrittura per il modulo di riscrittura URL.

Prerequisiti

Questa procedura dettagliata richiede i prerequisiti seguenti:

  1. IIS 7 o versione successiva con ASP.NET servizio ruolo abilitato.
  2. Modulo di riscrittura URL installato. Per altre informazioni, vedere Uso del modulo di riscrittura URL.

Configurazione di una pagina Web di test

Per illustrare il funzionamento del modulo di riscrittura URL, verrà usata una pagina di test semplice ASP.NET. Questa pagina legge le variabili del server Web e restituisce i relativi valori nel browser.

Copiare il codice ASP.NET seguente e inserirlo nella cartella %SystemDrive%\inetpub\wwwroot\ in un file denominato article.aspx:

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>URL Rewrite Module Test</title>
</head>
<body>
      <h1>URL Rewrite Module Test Page</h1>
      <table>
            <tr>
                  <th>Server Variable</th>
                  <th>Value</th>
            </tr>
            <tr>
                  <td>Original URL: </td>
                  <td><%= Request.ServerVariables["HTTP_X_ORIGINAL_URL"] %></td>
            </tr>
            <tr>
                  <td>Final URL: </td>
                  <td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
            </tr>
      </table>
</body>
</html>

Dopo aver copiato questo file, passare a http://localhost/article.aspx e verificare che la pagina sia stata eseguita correttamente in un browser.

Creazione di una regola di riscrittura

Verrà creata una semplice regola di riscrittura che riscriverà gli URL usando il formato seguente:

http://localhost/article/342/some-article-title
in:
http://localhost/article.aspx?id=342&title=some-article-title.

Verrà creata una regola di riscrittura usando l'interfaccia utente di riscrittura URL in Gestione IIS. A questo scopo, seguire questa procedura:

  1. Passare a Gestione IIS.
  2. Selezionare Sito Web predefinito.
  3. Nella visualizzazione funzionalità fare clic su URL Riscrivere.
    Screenshot che mostra il riquadro Home sito Web predefinito. È selezionata la riscrittura U R L.
  4. Nel riquadro Azioni sul lato destro fare clic su Aggiungi regole...
    Screenshot che mostra il riquadro Di riscrittura U R L.
  5. Nella finestra di dialogo Aggiungi regole selezionare Regola vuota e fare clic su OK.
    Screenshot che mostra la finestra di dialogo Aggiungi regole.

È ora necessario definire la regola di riscrittura effettiva. Nel modulo di riscrittura URL viene definita una regola di riscrittura specificando quattro informazioni necessarie:

  • Nome della regola.
  • Modello da usare per la corrispondenza della stringa URL.
  • Set facoltativo di condizioni.
  • Azione da eseguire se un modello è corrispondente e se tutti i controlli delle condizioni hanno esito positivo.

Denominazione di una regola

Nella casella di testo Nome immettere un nome che identifica in modo univoco la regola, ad esempio "Riscrivere in article.aspx".

Screenshot che mostra il riquadro Modifica regola in ingresso.

Definizione di un modello

Nella casella di testo Pattern immettere la stringa seguente:

^article/([0-9]+)/([_0-9a-z-]+)

Questa stringa è un'espressione regolare che specifica che il modello corrisponderà a qualsiasi stringa DI URL che soddisfi le condizioni seguenti:

  1. Inizia con la sequenza di caratteri "articolo/".
  2. Contiene uno o più caratteri numerici dopo il primo "/".
  3. Contiene uno o più caratteri alfanumerici o "_" o "-" dopo il secondo "/".

Si noti che alcune parti dell'espressione regolare sono tra parentesi. Queste parentesi creano gruppi di acquisizione, a cui è possibile fare riferimento in un secondo momento nella regola usando i riferimenti back-reference.

Definizione di un'azione

Poiché la regola creata dovrebbe riscrivere l'URL, scegliere il tipo di azione Di riscrittura elencato nella casella Gruppo di azioni . Nella casella di testo Riscrivere l'URL: immettere la stringa seguente:

article.aspx?id={R:1}&title={R:2}

Questa stringa specifica il nuovo valore a cui deve essere riscritto l'URL di input. Si noti che per i valori dei parametri della stringa di query è stato usato {R:1} e {R:2}, che sono riferimenti indietro ai gruppi di acquisizione definiti nel modello di regola usando parentesi.

Lasciare i valori predefiniti per tutte le altre impostazioni. La pagina Della proprietà Modifica regola in ingresso dovrebbe essere simile alla pagina seguente:

Screenshot che mostra la pagina della proprietà Modifica regola in ingresso.

Salvare la regola facendo clic su Applica sul lato destro.

Visualizzazione della regola di riscrittura nel file di configurazione

Le regole di riscrittura vengono archiviate nel file ApplicationHost.config o nei file di Web.config. Per controllare la configurazione della regola appena creata, aprire un file Web.config che si trova in %SystemDrive%\inetpub\wwwroot. In questo file verrà visualizzata la <rewrite> sezione contenente questa definizione di regola:

<rewrite>
  <rules>
    <rule name="Rewrite to article.aspx">
      <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
      <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
    </rule>
  </rules>
</rewrite>

La sintassi precedente si applica anche alla configurazione della riscrittura DELL'URL in Web.config in Siti Web di Windows Azure (WAWS).

Test della regola di riscrittura

Per verificare che la regola riscriva correttamente gli URL, aprire un Web browser e richiedere l'URL seguente:

http://localhost/article/234/some-title

Si noterà che la regola di riscrittura nel server Web ha modificato l'URL originale in Article.aspx e ha passato "234" e "some-title" come valori per i parametri della stringa di query.

Screenshot che mostra la pagina di test del modulo di riscrittura U R L in Internet Explorer.

Creazione di una regola di reindirizzamento

Verrà ora creata una regola di reindirizzamento che reindirizzerà tutti gli URL nel formato seguente:

http://localhost/blog/some-other-title/543
nel formato seguente:
http://localhost/article/543/some-other-title

Una regola di reindirizzamento consente a più URL di puntare a una singola pagina Web.

A tale scopo, aprire l'interfaccia utente della visualizzazione funzionalità di riscrittura URL in Gestione IIS. Fare clic su Aggiungi regola...e quindi selezionare di nuovo il modello Regola vuota .

Nella pagina Modifica regola immettere quanto segue:

  • Nome: reindirizzare dal blog (nome univoco per la regola).
  • Pattern: ^blog/([_0-9a-z-]+)/([0-9]+) (Questo modello corrisponde alla stringa URL che inizia con "blog" e acquisisce i secondi e i terzi segmenti dell'URL in back-references.
  • Azione: Reindirizzamento (l'azione di reindirizzamento causerà l'invio di una risposta di reindirizzamento al browser).
  • URL di reindirizzamento: articolo/{R:2}/{R:1} (questa stringa di sostituzione verrà usata come URL di reindirizzamento; si noti che usa riferimenti indietro per mantenere e ridisporre le parti dell'URL originale acquisite durante la corrispondenza del modello).

Immettere il nome, il modello e l'azione, come illustrato di seguito:

Screenshot che mostra il riquadro Modifica regola in ingresso. Sono disponibili nuove voci per nome, modello e azione.

Immettere l'URL di reindirizzamento come illustrato di seguito:

Screenshot che mostra il riquadro Modifica regola in ingresso. In Tipo di azione è stato selezionato il reindirizzamento e viene immesso un reindirizzamento U R L.

Lasciare i valori predefiniti per tutte le altre impostazioni. Salvare la regola facendo clic su Applica sul lato destro.

Test della regola di reindirizzamento

Per verificare che la regola reindirizzi correttamente le richieste, aprire un Web browser e richiedere l'URL seguente:

http://localhost/blog/some-other-title/323

Si noterà che il browser è stato reindirizzato a http://localhost/article/323/some-other-title come risultato dell'esecuzione della regola di reindirizzamento e quindi la richiesta è stata riscritta in conformità alla regola di riscrittura creata in precedenza.

Screenshot che mostra Internet Explorer nella pagina di test del modulo di riscrittura U R L.

Creazione di una regola di blocco di accesso

La terza regola creata viene usata per bloccare tutte le richieste effettuate a un sito Web se tali richieste non dispongono del set di intestazioni host. Questo tipo di regola è utile quando si desidera evitare tentativi di hacking effettuati eseguendo richieste HTTP sull'indirizzo IP del server anziché usando il nome host.

Verrà creata questa regola senza usare Gestione IIS. Aprire il file Web.config nella %SystemDrive%\inetpub\wwwroot\ cartella usata per il file di test article.aspx all'inizio di questo articolo. Individuare la sezione <rewrite>. Inserire la regola seguente nell'insieme <regole> , in modo che sia la prima regola nella raccolta:

<rule name="Fail bad requests">
  <match url=".*"/>
  <conditions>
    <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
  </conditions>
  <action type="AbortRequest" />
</rule>

La <rewrite> sezione dovrebbe essere simile al codice seguente:

<rewrite>
  <rules>
    <rule name="Fail bad requests">
      <match url=".*"/>
      <conditions>
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
      <action type="AbortRequest" />
    </rule>
    <rule name="Redirect from blog">
      <match url="^blog/([_0-9a-z-]+)/([0-9]+)" />
      <action type="Redirect" url="article/{R:2}/{R:1}" redirectType="Found" />
    </rule>
    <rule name="Rewrite to article.aspx">
      <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
      <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
    </rule>
  </rules>
</rewrite>

Analizziamo la regola per comprendere cosa fa.

<match url=".*"/>

L'elemento precedente indica che la regola corrisponderà a qualsiasi stringa URL.

<add input="{HTTP_HOST}" pattern="localhost" negate="true" />

L'elemento precedente aggiunge una condizione alla regola che recupera il valore dell'intestazione host leggendo la variabile del server HTTP_HOST, la corrisponde al modello "localhost" e quindi nega il risultato della corrispondenza. In altre parole, la condizione verifica che l'intestazione host non corrisponda a "localhost".

<action type="AbortRequest" />

L'elemento precedente indica al modulo di riscrittura URL per terminare la richiesta HTTP.

Test della regola del blocco di accesso

Per testare questa regola, aprire un Web browser e effettuare una richiesta a http://127.0.0.1/article/234/some-title. Ciò che dovrebbe essere visualizzato è un browser che non riceve alcuna risposta dal server. Tuttavia, se si richiede http://localhost/article/234/some-title, il server Web risponderà correttamente.

La visualizzazione non riuscita sarà la seguente:

Screenshot che mostra un browser che indica che questa pagina non può essere visualizzata.

La visualizzazione riuscita sarà la seguente:

Screenshot che mostra la pagina di test del modulo di riscrittura U R L in un browser.

Riepilogo

In questa procedura dettagliata si è appreso come configurare le regole di riscrittura dell'URL usando gestione IIS o modificando manualmente i file Web.config. Le regole create in questa procedura dettagliata hanno illustrato alcune delle principali funzionalità del modulo di riscrittura URL, ad esempio il supporto delle espressioni regolari e la possibilità di usare intestazioni HTTP e variabili del server per prendere decisioni di riscrittura.