2010-04-27 26 views
13

Come è possibile impostare un URL di reindirizzamento per una directory virtuale in IIS 7.0? Ho installato l'ultimo url rewrite module 2.x.URL di reindirizzamento IIS per la directory virtuale

posso spiegare il mio problema con un esempio:

Ho un sito web sul mio server IIS 7.0, www.mysite.com. Ho deciso di creare una directory virtuale "vendite" sotto il mio sito che punta alla directory principale del sito web. Ora ho bisogno di creare un URL di reindirizzamento per il vdir. Il vdir punta alla stessa directory root virtuale della root del mio sito.

La grande idea è che posso andare su www.mysite/sales e automaticamente reindirizzare su www.mysite.com?productid=200.

ho cercato di reindirizzare un URL Rewrite per vdir (non il sito), ma ho sempre questo messaggio di errore:

Cannot add duplicate collection entry of type 'rule' with unique key 
attribute 'name' set to "test". 

Questo accade quando indico la vdir virtuale e cercare di aggiungere una regola .

Posso aggiungere regole a livello di sito Web, ma le regole non funzionano. Voglio dire url "www.mysite/sales" mi dà il seguente errore. So che la chiave è unica. L'ho controllato da web.config.

Questo tipo di funzionalità è stato davvero facile da utilizzare in IIS 6.0, basta puntare su vdir con il mouse e impostare proprietà -> un reindirizzamento all'URL.

Per favore qualcuno spiega quale è il modo giusto per farlo in IIS 7.0?

+0

Vedi anche [URL Rewrite di una sottodirectory a un dominio diverso utilizzando IIS] (https://stackoverflow.com/questions/22392522/url-rewrite-of-a-subdirectory-to-a-different- domain-using-iis) in avanti invece del reindirizzamento. – Vadzim

risposta

28

In realtà non è così facile, ma non troppo orribile.

1) Creare una directory fisica invece di una directory virtuale.

2) Assicurarsi di disporre dei servizi di ruolo di reindirizzamento HTTP. Vedi http://www.iis.net/ConfigReference/system.webServer/httpRedirect

3) Aprire Gestione IIS e individuare la directory fisica che si desidera reindirizzare.

4) Fare doppio clic sull'icona "Reindirizzamento HTTP" in IIS.

5) Controllare la "reindirizzare le richieste a questa destinazione" scatola e immettere il nuovo URL (http://example.com/newPage.html)

6) Controllare i prossimi due scatole, se necessario; Trovo solitamente necessario controllare entrambi.

7) Premere il pulsante Applica.

8) Selezionare Sito Web e "Riavvia" in Gestisci sito Web.

9) Test.

+0

Buona risposta, +1 – ajdams

+0

Grazie a questo ha aiutato –

+0

ha funzionato bene, ma non ho bisogno di riavviare il sito in IIS 8.5. –

2

Il motivo per cui questo sta accadendo è perché per impostazione predefinita tutte le configurazioni di regole vengono ereditate dalle applicazioni Web padre. Pertanto, se esiste una regola definita all'interno del sito Web principale, viene ereditata in tutti i successivi siti Web secondari nella gerarchia; a meno che non sia stato cancellato.

Così, per esempio, se la gerarchia di applicazioni di IIS è la seguente - Sito Web

di default (Radice)

| Applicazione Web 1 (VDir1) | Web Sub Application 11 (VDir2)

| Web Application 2 (VDir3)

La Regola con un nome 'Test', se esiste nell'applicazione Radice, esso viene ereditato al Web Application 1, applicazioni Web 11 e Web Application 2

Nel tuo caso Web L'applicazione 11 (VDir2) è fisicamente nella stessa posizione di (VDir1). Quindi, le configurazioni di IIS sono le stesse per entrambe le directory poiché condivide lo stesso file Web.config.

Quindi qualsiasi nuova regola aggiunta al file Web.config verrà applicata automaticamente a entrambe queste directory virtuali (VDir1 & VDir2). E poiché le regole vengono ereditate per impostazione predefinita, il motore delle regole in IIS troverà un problema durante l'analisi della regola, poiché esiste già per ereditarietà.

Una possibile soluzione consiste nell'aggiungere un tag < Cancella /> prima di aggiungere qualsiasi regola all'interno del file web.config, in modo che cancelli tutte le regole ereditate.

<rewrite> 
    <rules> 
    <clear/> 
    <rule name="test" stopProcessing="true"> 
     <match xxx /> 
     <action xxx /> 
    </rule> 
    </rules> 
</rewrite> 

Tuttavia, io preferirei il < nome Rimuovi = 'Nome regola' /> tag, invece di indirizzare rimuovere la regola che devono essere aggiunti nella configurazione ereditato. Ciò garantirebbe che tutte le altre regole sul sito Web principale vengano ereditate nella gerarchia; con solo questa nuova regola essere (sorta) sovrascritta.

<rewrite> 
    <rules> 
    <remove name="test"/> 
    <rule name="test" stopProcessing="true"> 
     <match xxx /> 
     <action xxx /> 
    </rule> 
    </rules> 
</rewrite> 
+0

Funziona davvero? Questo è genio. – Gaspa79

+0

@ Gaspa79, questo sì. potresti provarlo e pubblicare i risultati. – XpertSiji

+0

Sì, l'ho provato e ho fatto meraviglie. Molte grazie! – Gaspa79

Problemi correlati