Condividi tramite


Uso di provider di riscrittura personalizzati con modulo di riscrittura URL

di Ruslan Kashšev

Questa procedura dettagliata illustra come usare provider di riscrittura personalizzati con URL Rewrite Module 2.0. La procedura dettagliata usa gli esempi di estendibilità di riscrittura URL 2.0, che possono essere scaricati da URL Rewrite Extensibility Samples (Esempi di estendibilità di riscrittura URL) in MSDN Code Gallery.

Esempi di estendibilità di riscrittura URL di installazione

Per completare questa procedura dettagliata, scaricare e installare gli esempi di estendibilità di riscrittura URL (https://www.microsoft.com/download/details.aspx?id=43353). Il pacchetto di installazione Extensibility Samples include assembly .NET e il codice sorgente con implementazione completa dei provider di riscrittura per i tre casi d'uso più comuni:

  • Archiviazione dei mapping di riscrittura o reindirizzamento in un database SQL;
  • Archiviazione dei mapping di riscrittura o reindirizzamento in un file di testo;
  • Archiviazione delle sottostringhe di ricerca in un file di testo.

Durante l'installazione assicurarsi di selezionare l'opzione "Runtime" nell'installazione personalizzata. Verranno registrati i provider di esempio in .NET Global Assembly Cache in modo che possano essere usati dal modulo di riscrittura URL.

Screenshot della finestra di dialogo I S S U R L Rewrite Extensibility Samples Setup .Screenshot della finestra di dialogo I S U R L Rewrite Extensibility Samples Setup . L'icona Runtime è evidenziata.

Registrazione dei provider

Nel pacchetto di installazione sono inclusi 3 provider di riscrittura:

  • DbProvider: questo provider può essere usato per recuperare i mapping di riscrittura da una tabella di database di SQL Server eseguendo una stored procedure
  • FileMapProvider: questo provider può essere usato per recuperare i mapping di riscrittura archiviati in un file di testo
  • FileContainsProvider: questo provider può essere usato per verificare se una stringa in un file di testo è una sottostringa della stringa di input del provider.

Per usare i provider di esempio nelle regole di riscrittura, i provider devono essere registrati con IIS. Per registrare un provider, è possibile usare l'interfaccia utente di Gestione IIS:

  1. Aprire la funzionalità Di riscrittura URL in Gestione IIS;
  2. Selezionare "Visualizza provider..." azione nel riquadro "Azioni" sul lato destro;
    Screenshot della home page I S Manager U R L Rewrite. Nel riquadro Azioni a destra viene evidenziato Visualizza provider.
  3. Selezionare "Aggiungi provider..." azione nel riquadro "Azioni" ;
  4. Nella finestra di dialogo "Aggiungi provider" immettere il nome che si vuole usare per questo provider quando si fa riferimento a esso da una regola di riscrittura.
  5. Dopo aver scelto il tipo .NET corrispondente per il provider nell'elenco a discesa "Tipo gestito". Si noti che la visualizzazione dei tipi di provider potrebbe richiedere del tempo.
    Screenshot della pagina I S Manager. Viene visualizzata la pagina Riscrivi provider. Nel riquadro Azioni a destra è evidenziato Aggiungi provider.
  6. Ripetere i passaggi precedenti per registrare tutti e tre i provider.

Uso di DbProvider

Per usare DbProvider è necessario accedere a Microsoft SQL Server. Il provider si connette a un database di SQL Server ed esegue una stored procedure che accetta un parametro di input NVARCHAR contenente la stringa dell'URL di input e restituisce una riga, un set di risultati di colonna contenente la stringa dell'URL di output di tipo NVARCHAR.

Creazione di un database di esempio

Aprire un'istanza di SQL Server Management Studio, aprire una nuova finestra di query ed eseguire lo script SQL seguente:

USE [master]

CREATE LOGIN [IIS APPPOOL\DefaultAppPool] FROM WINDOWS WITH DEFAULT_DATABASE=[master]

CREATE DATABASE [RewriteDB]
GO

USE [RewriteDB]
GO

CREATE TABLE [dbo].[RewriteTable](
[OriginalUrl] [nvarchar](256) NOT NULL,
[NewUrl] [nvarchar](256) NOT NULL
) ON [PRIMARY]
GO

CREATE PROCEDURE [dbo].[GetRewrittenUrl] 
@input nvarchar(256)
AS
SELECT rt.NewUrl 
FROM dbo.RewriteTable rt 
WHERE rt.OriginalUrl = @input
GO

CREATE USER [IIS APPPOOL\DefaultAppPool] FOR LOGIN [IIS APPPOOL\DefaultAppPool]

GRANT EXECUTE ON dbo.GetRewrittenUrl TO [IIS APPPOOL\DefaultAppPool];
GO

INSERT INTO dbo.RewriteTable VALUES ('old/catalog/product.html', 'new/category/product.html');
INSERT INTO dbo.RewriteTable VALUES ('old/contactus/index.html', 'new/contactus.html');
GO

Lo script precedente crea un nuovo database denominato RewriteDB, con una tabella RewriteTable e una stored procedure GetRewrittenURL. Concede inoltre le autorizzazioni all'account IIS APPPOOL\DefaultAppPool per eseguire tale stored procedure. Riempie anche la tabella di database con due mapping URL.

Configurazione delle impostazioni di DbProvider

Configurare l'istanza di DbProvider per chiamare la stored procedure:

  1. In Gestione IIS nella visualizzazione delle funzionalità di riscrittura URL selezionare "Visualizza provider..." int il riquadro azioni.
  2. Selezionare "Aggiungi provider" e scegliere DbProvider. Denominarlo DB; che sarà il nome in base al quale si farà riferimento al provider da una regola di riscrittura
  3. Selezionare l'istanza dbProvider denominata DB e fare clic su "Aggiungi impostazione provider..." azione.
  4. Usare la finestra di dialogo "Modifica impostazione provider" per configurare il provider:
    Screenshot della pagina I S Manager. Viene visualizzata la pagina Riscrivi provider. Viene visualizzata una finestra di dialogo Modifica impostazione provider e nella casella Nome è presente il testo S Q L Server stringa di connessione.

Usare i valori seguenti per le impostazioni del provider:

  • SQL Server stringa di connessione: specificare un stringa di connessione di SQL Server, ad esempio:
    "Data Source=servername\sqlexpress; Initial Catalog=RewriteDB; Integrated Security=True"
  • Nome stored procedure: GetRewrittenUrl
  • Intervallo minuti cache: impostato su 0 se i valori nella tabella SQL non vengono modificati o impostati su un numero intero positivo in modo che il provider aggiorni periodicamente la cache di riscrittura interna del modulo. Se non viene specificato il valore 0, si presuppone.

Chiamata di DbProvider da una regola di riscrittura

Nella directory radice di un sito Web aprire il file web.config . Se si usa il sito Web predefinito iis, il file deve trovarsi nella C:\inetpub\wwwroot\ cartella .

Incollare la regola di reindirizzamento seguente nel file web.config all'interno dell'elemento /<configuration>/<system.webServer>/<rewrite>/<rules> :

<rule name="DbProviderTest" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{DB:{R:1}}" pattern="(.+)" />
    </conditions>
    <action type="Redirect" url="{C:1}" />
</rule>

Il contenuto completo del file web.config dovrebbe essere simile al seguente:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
    <providers>
        <provider name="DB" type="DbProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <settings>
                <add key="ConnectionString" value="Data Source=ruslany-server\sqlexpress;Initial Catalog=RewriteDB;Integrated Security=True" />
                <add key="StoredProcedure" value="GetRewrittenUrl" />
                <add key="CacheMinutesInterval" value="0" />
            </settings>
        </provider>
    </providers>
    <rules>
        <rule name="DbProviderTest" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{DB:{R:1}}" pattern="(.+)" />
            </conditions>
            <action type="Redirect" url="{C:1}" />
        </rule>
    </rules>
</rewrite>

Questa regola esegue il reindirizzamento HTTP a un URL ottenuto da un database di SQL Server tramite DbProvider. L'istanza dbProvider denominata "DB" viene richiamata dalla condizione della regola e se il risultato restituito dal provider non è vuoto, viene eseguito il reindirizzamento HTTP.

Per testare la regola, aprire un Web browser e effettuare una richiesta a http://localhost/old/catalog/product.html o http://localhost/old/contactus/index.html. Si noti che il browser viene reindirizzato a un nuovo URL in base ai mapping di reindirizzamento definiti nella tabella di database RewriteDB. Il server Web restituirà l'errore HTTP 404 per l'URL reindirizzato perché non esiste un file o una directory di questo tipo nel server, ma ciò non è rilevante ai fini di questa procedura dettagliata. La parte importante è che il server Web ha emesso una risposta di reindirizzamento in base alla regola che ha usato DbProvider.

Uso di FileMapProvider

FileMapProvider legge i mapping degli URL da un file di testo. Può essere usato invece della funzionalità di riscrittura delle mappe predefinite quando la quantità di voci della mappa di riscrittura è molto grande e non è pratico mantenerle in un file web.config.

Creazione di un file di mapping di esempio

Creare una nuova directory denominata App_Data nella directory radice del sito Web. In tale directory creare un file di testo denominato redirectmappings.txt. Aggiungere le righe seguenti al file :

old/catalog/product.html, new/category/product.html
old/contactus/index.html, new/contactus.html

Immagine che mostra un simbolo di avviso prima che venga visualizzata la nota AVVISO.AVVERTIMENTO: Assicurarsi sempre che il file di testo non sia direttamente accessibile dal Web. Usare il modulo di filtro richieste IIS o posizionare il file all'interno di App_Data cartella per impedire ai client HTTP di accedere direttamente al contenuto di questo file.

Configurazione di FileMapProvider

Configurare FileMapProvider seguendo la stessa procedura descritta in Configurazione di DbProvider. Usare questi valori per le impostazioni del provider:

  • FilePath: {DOCUMENT_ROOT}\App_Data\redirectmappings.txt (si noti l'utilizzo di {DOCUMENT_ROOT} nel percorso del file. Questa operazione viene sostituita con il percorso effettivo durante l'inizializzazione del provider. Ciò è utile quando non si vuole inserire un percorso di file assoluto nel file web.config)
  • IgnoreCase: 1
  • Separatore: "," (se non specificato, il simbolo TAB verrà usato come separatore)

Chiamata di FileMapProvider da una regola di riscrittura

Nella directory radice di un sito Web aprire il file web.config . Se si usa il sito Web predefinito iis, il file deve trovarsi nella C:\inetpub\wwwroot\ cartella .

Incollare la regola di reindirizzamento seguente nel file web.config all'interno dell'elemento /<configuration>/<system.webServer>/<rewrite>/<rules> :

<rule name="FileMapProviderTest" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{FileMap:{R:1}}" pattern="(.+)" />
    </conditions>
    <action type="Redirect" url="{C:1}" />
</rule>

Il contenuto completo del file web.config dovrebbe essere simile al seguente:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
    <providers>
        <provider name="FileMap" type="FileMapProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <settings>
                <add key="FilePath" value="{DOCUMENT_ROOT}\App_Data\redirectmappings.txt" />
                <add key="IgnoreCase" value="1" />
                <add key="Separator" value="," />
            </settings>
        </provider>
    </providers>
    <rules>
        <rule name="FileMapProviderTest" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{FileMap:{R:1}}" pattern="(.+)" />
            </conditions>
            <action type="Redirect" url="{C:1}" />
        </rule>
    </rules>
</rewrite>

Questa regola esegue il reindirizzamento HTTP a un URL ottenuto da un file di testo tramite FileMapProvider. L'istanza fileMapProvider denominata "FileMap" viene richiamata dalla condizione della regola e se il risultato restituito dal provider non è vuoto, viene eseguito il reindirizzamento HTTP.

Per testare la regola, aprire un Web browser e effettuare una richiesta a http://localhost/old/catalog/product.html o http://localhost/old/contactus/index.html. Si noti che il browser viene reindirizzato a un nuovo URL in base ai mapping di reindirizzamento definiti nel file redirectmappings.txt. Il server Web restituirà l'errore HTTP 404 per l'URL reindirizzato perché non esiste un file o una directory di questo tipo nel server, ma ciò non è rilevante ai fini di questa procedura dettagliata. La parte importante è che il server Web ha emesso una risposta di reindirizzamento in base alla regola che ha usato FileMapProviders.

Uso di FileContainsProvider

FileContainsProvider legge il set di stringhe da un file di testo e quindi controlla se la stringa di input del provider contiene una di queste stringhe come sottostringa. Il provider può essere usato, ad esempio, con regole di riscrittura che bloccano l'accesso in base all'intestazione dell'agente utente.

Creazione di un file user-agents non consentito di esempio

Creare una nuova directory denominata App_Data nella directory radice del sito Web. In tale directory creare un file di testo denominato disalloweduseragents.txt. Aggiungere le righe seguenti al file :

badrobot1
badrobot2

Prima di una nota AVVISO viene visualizzata un'immagine di un simbolo di avviso. L'immagine è di un triangolo con un punto esclamativo al centro.AVVERTIMENTO: Assicurarsi sempre che il file di testo non sia direttamente accessibile dal Web. Usare il modulo di filtro richieste IIS o posizionare il file all'interno di App_Data cartella per impedire ai client HTTP di accedere direttamente al contenuto di questo file.

Configurazione di FileContainsProvider

Configurare FileMapProvider seguendo la stessa procedura descritta in Configurazione di DbProvider. Usare questi valori per le impostazioni del provider:

  • FilePath: {DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt (si noti l'utilizzo di {DOCUMENT_ROOT} nel percorso del file. Questa operazione viene sostituita con il percorso effettivo durante l'inizializzazione del provider. Ciò è utile quando non si vuole inserire un percorso di file assoluto nel file web.config)
  • IgnoreCase: 1

Chiamata di FileContainsProvider da una regola di riscrittura

Nella directory radice di un sito Web aprire il file web.config . Se si usa il sito Web predefinito iis, il file deve trovarsi nella C:\inetpub\wwwroot\ cartella .

Incollare la regola di reindirizzamento seguente nel file web.config all'interno dell'elemento /<configuration>/<system.webServer>/<rewrite>/<rules> :

<rule name="FileContainsProviderTest" stopProcessing="true">
    <match url=".*" />
    <conditions>
        <add input="{FileContains:{HTTP_USER_AGENT}}" pattern=".+" />
    </conditions>
    <action type="AbortRequest" />
</rule>

Il contenuto completo del file web.config dovrebbe essere simile al seguente:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
    <providers>
        <provider name="FileContains" type="FileContainsProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <settings>
                <add key="FilePath" value="{DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt" />
                <add key="IgnoreCase" value="1" />
            </settings>
        </provider>
    </providers>
    <rules>
        <rule name="FileContainsProviderTest" stopProcessing="true">
            <match url=".*" />
            <conditions>
                <add input="{FileContains:{HTTP_USER_AGENT}}" pattern=".+" />
            </conditions>
            <action type="AbortRequest" />
        </rule>
    </rules>
</rewrite>

Questa regola interrompe la connessione HTTP se l'agente utente della richiesta HTTP corrisponde a una delle stringhe elencate nel file disalloweduseragents.txt. L'istanza FileContainsProvider denominata "FileContains" viene richiamata dalla condizione della regola e se il risultato restituito dal provider non è vuoto, la connessione HTTP viene interrotta.

Per testare la regola aprire WFetch e aggiungere un'intestazione user-agent alla richiesta come indicato di seguito:

user-agent: badrobot1\r\n

Da WFetch effettuare una richiesta a http://localhost/test/. Si noterà che la connessione viene interrotta perché la stringa dell'agente utente corrisponde a una delle stringhe nel file disalloweduseragents.txt.

Screenshot della pagina w fetch one dialog. La connessione viene interrotta perché la stringa dell'agente utente corrisponde a una delle stringhe nel file t x t t consentito degli agenti utente non consentiti.