Condividi tramite


Uso di regole di riscrittura globali e distribuite

di Ruslan Kashšev

Questa procedura dettagliata illustra i diversi tipi di regole supportate dal modulo di riscrittura URL e illustra come configurare le regole di riscrittura globali e distribuite.

Sfondo

Le regole di riscrittura globali vengono usate per definire la logica di riscrittura url a livello di server. Queste regole vengono definite all'interno di applicationHost.config file e non possono essere sottoposte a override o disabilitate in livelli di configurazione inferiori, ad esempio il sito o la directory virtuale. Le regole globali operano sempre sul percorso URL assoluto, ovvero l'URI richiesto senza il nome del server. Ad esempio, se è stata effettuata una richiesta a http://localhost/directory1/directory2/index.html, il modulo di riscrittura URL passerà "directory1/directory2/index.html" come input per una regola globale.

Le regole di riscrittura distribuite vengono usate per definire la logica di riscrittura URL specifica per un ambito di configurazione specifico. Le regole distribuite possono essere definite a qualsiasi livello di configurazione (ad eccezione del file) usando web.config file. Le regole locali operano sempre sugli URL relativi al percorso di Web.config file in cui sono definiti. Ad esempio, se è stata effettuata una richiesta a http://localhost/directory1/directory2/index.html e una regola di riscrittura è stata definita in Web.config file che si trova in directory1, il modulo di riscrittura URL passerà "directory2/index.html" come input a tale regola.

Il set di regole globali viene sempre valutato per primo e dopo il set di regole distribuite verrà valutato usando una stringa URL prodotta dal set di regole globali.

Prerequisiti

Questa procedura dettagliata richiede i prerequisiti seguenti:

  1. IIS 7.0 o versione successiva con servizio ruolo ASP.NET abilitato
  2. Rilascio live della riscrittura URL installato

Configurazione di uno scenario di guida passo-passo

Per illustrare come usare le regole globali e locali, verrà implementato uno scenario comune di mapping dei sottodomini alle directory. Ciò consentirà di usare i sottodomini per accedere al contenuto in directory diverse nel sito. Ad esempio, gli utenti potranno navigare verso http://blog.mysite.com anziché http://mysite.com/blog, o verso http://forum.mysite.com anziché http://mysite.com/forum.

Per configurare lo scenario, seguire questa procedura:

  1. Creare due cartelle denominate "blog" e "forum" nella %SystemDrive%\inetpub\wwwroot\ cartella .

  2. Copiare il codice asp.net seguente e inserirlo nella %SystemDrive%\inetpub\wwwroot\blog cartella 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>
          <p>This page is located in blog subdomain.</p>
          <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>
    
  3. Copiare il codice asp.net seguente e inserirlo nella %SystemDrive%\inetpub\wwwroot\forum cartella in un file denominato forum.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>
          <p>This page is located in forum subdomain.</p>
          <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>
    
  4. Aprire il file denominato "hosts", che si trova in %SystemDrive%\windows\system32\drivers\etc\ e aggiungere le due righe seguenti al suo interno:

    127.0.0.1 forum_localhost
    127.0.0.1 blog_localhost
    

    Dopo aver aggiunto queste righe, aprire un browser Web e navigare verso http://blog_localhost/blog/article.aspx e http://forum_localhost/forum/forum.aspx, e verificare che il rendering delle pagine sia stato eseguito correttamente in un browser.

Creazione di una regola di riscrittura globale

Prima di tutto verrà creata una regola di riscrittura globale che riscrive l'URL in base all'intestazione host. Ad esempio, se la richiesta è stata effettuata a http://blog_localhost/article.aspx , la regola modificherà il percorso URL in "/blog/article.aspx".

Per creare una regola globale usando l'interfaccia utente di riscrittura URL in Gestione IIS, seguire questa procedura:

  1. Passare a Gestione IIS
  2. Nella visualizzazione albero di spostamento selezionare il nodo del server.
  3. Nella visualizzazione funzionalità fare clic su "URL Rewrite Module"
    Screenshot della home page WIN 2008 RTM. L'icona di Riscrittura URL è evidenziata.
  4. Nel riquadro "Azioni" fare clic su "Aggiungi regole..."
    Screenshot della pagina U R L Rewrite. Nel riquadro Azioni Aggiungi Regole è evidenziata.
  5. Nella finestra di dialogo "Aggiungi regole" selezionare "Regola vuota" e fare clic su "Ok":
    Screenshot della finestra di dialogo Aggiungi regole. L'icona Regola vuota è selezionata.

Ora è necessario definire la regola di riscrittura effettiva. Nel modulo URL Rewrite, una regola di riscrittura è definita specificando quattro informazioni essenziali:

  • Nome della regola
  • Modello da usare per la corrispondenza della stringa URL
  • Set facoltativo di condizioni
  • Azione da eseguire se il criterio è stato confrontato e tutti i controlli delle condizioni hanno avuto esito positivo

Denominazione di una regola

Nella casella di testo "Nome" immettere un nome che identificherà in modo univoco la regola, ad esempio: "Mappatura del sottodominio".

Definizione di un modello

Nella casella di testo "Pattern" immettere la stringa seguente:

(.*)

Questa stringa è un'espressione regolare che specifica che il pattern corrisponderà a qualsiasi stringa URL, inclusa una stringa vuota e catturerà la stringa corrispondente in un back-reference.

Definizione di una condizione

Fare clic sul pulsante "Aggiungi condizioni":

Screenshot della pagina Modifica regola. Nella categoria Condizioni è evidenziata l'opzione Aggiungi condizioni.

Fare clic su "Aggiungi..." per visualizzare la finestra di dialogo per la definizione delle condizioni.

Screenshot della pagina delle Regole di Modifica. Il pulsante Aggiungi nella categoria Condizioni è evidenziato.
Per "Condition input:" immettere questa stringa: "{HTTP_HOST}". In questo modo viene configurato il modulo di riscrittura URL in modo da usare il valore dell'intestazione host della richiesta HTTP come input per la condizione

Nella casella combinata a discesa selezionare "Corrisponde al modello".

Nella casella di testo "Pattern" immettere "^([^_]+)_[^_]+". Questa espressione regolare verrà usata per trovare le corrispondenze con i domini creati (blog_localhost e forum_localhost) e acquisirà la parte della stringa prima del simbolo "_" in un back-reference. Ad esempio, per la stringa "blog_localhost", mantiene il "blog" nel back-reference.

Dopo aver specificato tutte le proprietà, la finestra di dialogo della condizione dovrebbe essere simile alla seguente:

Screenshot della finestra di dialogo Modifica condizione. Nella casella di input Condizione è scritto tra parentesi H T T P underscore HOST. La casella di controllo Ignora maiuscole/minuscole è selezionata.

Fare clic su OK per salvare la condizione e tornare all'interfaccia utente "Aggiungi regola".

Definizione di un'azione

Poiché la regola che si sta creando dovrebbe riscrivere l'URL, scegliere il tipo di azione "Riscrivi" all'interno della casella di gruppo "Azione". Nella casella di testo "Rewrite URL:" immettere la stringa seguente:

{C:1}/{R:1}

Questa stringa specifica l'URL di input da riscrivere. Il riferimento alla condizione {C:1} viene usato come nome della cartella e quindi qualsiasi elemento catturato nel modello di regola è mantenuto usando il riferimento alla regola {R:1}.

Lasciare i valori predefiniti per tutte le altre impostazioni. L'interfaccia utente "Modifica regola" dovrebbe essere simile alla pagina seguente:

Screenshot della pagina

Salvare la regola facendo clic sull'azione "Applica" sul lato destro.

Per comprendere come verrà applicata questa regola, verranno illustrati i passaggi eseguiti dal modulo di riscrittura URL quando il client HTTP richiede questo URL:
http://blog_localhost/article.aspx?id=323:

  1. Il modulo di riscrittura URL passa "article.aspx?id=323" come URL di input alla regola, lo abbina correttamente al modello di regola e lo cattura in un back-reference di regola {R:1}
  2. Il valore dell'intestazione host ("blog_localhost") corrisponde all'espressione regolare "^([^_]+)_[^_]+" e di conseguenza "blog" viene catturato in un riferimento di condizione all'indietro {C:1}
  3. In base alla stringa di sostituzione {C:1}/{R:1} l'URL viene riscritto in "blog/article.aspx?id=323".

Verifica della regola

Per verificare che la regola riscriva correttamente l'URL, aprire il browser Internet e richiedere l'URL seguente:
http://blog_localhost/article.aspx?id=123

Screenshot della pagina di test del modulo di riscrittura di U R L. Vengono visualizzate le informazioni sulla variabile server e le informazioni sul valore.

Si noterà che il modulo di riscrittura URL ha modificato l'URL e aperto una pagina Article.aspx nella directory "blog". Le modifiche apportate dal modulo di riscrittura URL sono basate sulle informazioni estratte dall'intestazione host.

Analogamente, quando si richiede http://forum_localhost/forum.aspx?id=345 l'URL verrà riscritto in /forum/forum.aspx?id=345.

Creazione di regole distribuite

La regola globale appena creata è stata usata per eseguire il mapping della richiesta a una cartella in base alle informazioni estratte dall'intestazione host. Ora si creeranno regole distribuite che consentiranno di avere l'URL senza parametri di stringa di query. Le regole distribuite accettano come input l'URL, che è già stato modificato dalla regola globale e eseguirà ulteriori modifiche. In particolare:

  • Una regola di riscrittura nella cartella "blog" riscriverà il percorso URL da "article/234/some-title" a "article.aspx?id=234&title=some-title"
  • Una regola di riscrittura nella cartella "forum" riscriverà il percorso URL da "topic/123/some-topic-title" a "forum.aspx?topic=some-topic-title&id=123"

Le regole locali possono essere create tramite Gestione IIS o modificando web.config file. A scopo dimostrativo, le regole verranno create modificando manualmente web.config file.

Per creare regole di riscrittura distribuite:

  1. Creare un file web.config vuoto nella %SystemDrive%\inetpub\wwwroot\**blog** cartella. Aprirlo nell'editor di testo e incollarvi il codice XML seguente:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <system.webServer>
        <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>
      </system.webServer>
    </configuration>
    
  2. Creare un file web.config vuoto nella %SystemDrive%\inetpub\wwwroot\**forum** cartella. Aprirlo nell'editor di testo e incollarvi il codice XML seguente:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <system.webServer>
        <rewrite>
          <rules>
            <rule name="Rewrite to forum.aspx">
              <match url="^topic/([0-9]+)/([_0-9a-z-]+)"/>
              <action type="Rewrite" url="forum.aspx?topic={R:2}&amp;id={R:1}"/>
            </rule>
          </rules>
        </rewrite>
      </system.webServer>
    </configuration>
    

Test delle regole globali e distribuite

Per verificare che tutte le regole funzionino correttamente insieme, aprire un Web browser e effettuare una richiesta a http://blog_localhost/article/234/some-title. La risposta nel browser dovrebbe indicare che l'URL è stato modificato per la prima volta da una regola globale e quindi è stato modificato anche da una regola distribuita.

Analogamente, se si richiede http://forum_localhost/topic/123/some-topic-title, si noterà che il modulo di riscrittura URL modifica la stringa URL richiesta in "/forum/forum.aspx?topic=some-topic-title&id=123".

Screenshot della pagina di test del modulo di riscrittura di U R L. La stringa U R L è stata modificata.

Sommario

In questa esercitazione hai implementato uno scenario di mappatura di sottodomini usando la regola globale e quindi hai utilizzato regole distribuite per abilitare URL facili da usare per le pagine Web in quelle cartelle.