Share via


Uso di regole di riscrittura globali e distribuite

di Ruslan Yakushev

Questa procedura dettagliata illustra i diversi tipi di regole supportati dal modulo di riscrittura url e illustra come configurare regole di riscrittura globali e distribuite.

Sfondo

Le regole di riscrittura globale vengono usate per definire la logica di riscrittura dell'URL a livello di server. Queste regole vengono definite all'interno di applicationHost.config file e non possono essere sostituite o disabilitate in qualsiasi livello di configurazione inferiore, 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 DELL'URL passerà "directory1/directory2/index.html" come input a una regola globale.

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

Il set di regole globali viene sempre valutato prima e dopo che 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 il servizio ruolo ASP.NET abilitato
  2. Riscrivere la versione go live dell'URL installata

Configurazione di uno scenario di procedura dettagliata

Per illustrare come usare 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 passare a http://blog.mysite.com anziché http://mysite.com/bloga o a http://forum.mysite.com anziché http://mysite.com/foruma .

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 "host", che si trova in %SystemDrive%\windows\system32\drivers\etc\ e aggiungere le due righe seguenti all'interno di esso:

    127.0.0.1 forum_localhost
    127.0.0.1 blog_localhost
    

    Dopo aver aggiunto queste righe, aprire un Web browser e passare a http://blog_localhost/blog/article.aspx e verificare http://forum_localhost/forum/forum.aspx che le pagine siano state visualizzate 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 cambierà il percorso DELL'URL su "/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 server.
  3. Nella visualizzazione funzionalità fare clic su "Url Riscrivere modulo"
    Screenshot della home page WIN two K otto R M. L'icona U R L Rewrite è evidenziata.
  4. Nel riquadro "Azioni" fare clic su "Aggiungi regole..."
    Screenshot della pagina Di riscrittura U R L. Nel riquadro Azioni Aggiungi regole è evidenziato.
  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. Nella regola di riscrittura del modulo di riscrittura URL è definita specificando quattro parti essenziali di informazioni:

  • Nome della regola
  • Modello da usare per la corrispondenza della stringa URL
  • Set facoltativo di condizioni
  • Azione da eseguire se il modello è stato corrispondente 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"Mapping sottodominio".

Definizione di un modello

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

(.*)

Questa stringa è un'espressione regolare che specifica che il modello corrisponde a qualsiasi stringa URL, inclusa una stringa vuota e acquisisce la stringa corrispondente in un riferimento indietro.

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..." pulsante per visualizzare la finestra di dialogo per definire le condizioni.

Screenshot della pagina Modifica regola. 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 per 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 corrispondere ai domini creati (blog_localhost e forum_localhost) e acquisisce la parte della stringa prima di "_" in un riferimento back-reference. Ad esempio, per la stringa "blog_localhost", verrà mantenuto il "blog" nel back-reference.

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

Screenshot della finestra di dialogo Modifica condizione. Nella casella di input Condizione viene scritta la parentesi quadre di testo H T T P di sottolineatura HOST di sottolineatura. La casella di controllo Ignora maiuscole e minuscole viene selezionata.

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

Definizione di un'azione

Poiché la regola creata dovrebbe riscrivere l'URL, scegliere il tipo di azione "Riscrivere" nella 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 indietro alla condizione {C:1} viene usato come nome della cartella e quindi qualsiasi elemento acquisito nel modello di regola venga mantenuto usando il riferimento indietro 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 Modifica regola. Le colonne Input, Type e Pattern dispongono di testo.

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

Per comprendere come verrà applicata questa regola, verranno illustrati i passaggi eseguiti dal modulo di riscrittura dell'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 corrisponde correttamente al modello di regola e lo acquisisce in un back-reference di regola {R:1}
  2. Il valore dell'intestazione host ("blog_localhost") corrisponde correttamente all'espressione regolare "^([^_]+)_[^_]+" e, di conseguenza, "blog" viene acquisita in una condizione di back-reference {C:1}
  3. In base alla stringa di sostituzione {C:1}/{R:1} l'URL viene riscritto in "blog/article.aspx?id=323".

Test 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 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. Verrà ora creata una regola distribuita che consentirà di avere l'URL senza parametri stringa di query. Le regole distribuite accettano come input l'URL, che è già stato modificato dalla regola globale e eseguirà modifiche aggiuntive. 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" riscrive il percorso URL da "topic/123/some-topic-title" a "forum.aspx?topic=some-topic-title&id=123"

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

Per creare regole di riscrittura distribuite:

  1. Creare un file di web.config vuoto nella %SystemDrive%\inetpub\wwwroot\**blog** cartella. Aprirlo nell'editor di testo e quindi incollarlo nel 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 di web.config vuoto nella %SystemDrive%\inetpub\wwwroot\**forum** cartella. Aprirlo nell'editor di testo e quindi incollarlo nel 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 di regole globali e distribuite

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

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

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

Riepilogo

In questa esercitazione è stato implementato uno scenario di mapping di sottodominio usando la regola globale e quindi sono state usate regole distribuite per abilitare l'URL descrittivo per le pagine Web in tali cartelle.