2013-06-06 18 views
5

Ecco quello che ho schierato:IIS Rewrite Module e sub applicazioni

IIS deploy

testRedirect è un sito di vuoto. Tutte le sotto-applicazioni sono sotto-cartelle che sono state convertite in applicazione. Tutti loro sono siti ASP .Net MVC.

Ecco cosa voglio installare:

  • Http://localhost/ deve mostrare il contenuto di SiteName1 senza visualizzare Http://localhost/SiteName1/ nella barra indirizzo (deve rimanere Http://localhost/)

  • Http://localhost/SiteName1/ deve mostrare il contenuto di SiteName1 senza visualizzare Http://localhost/SiteName1/ nella barra degli indirizzi (deve rimanere Http://localhost/)

  • Http://localhost/SiteName2/ mostra il contenuto di SiteName2 e display Http://localhost/SiteName2/ nella barra di indirizzo (stesso comportamento per SiteName3 & SiteName4 e altri siti ....)

In altre parole, voglio il mio SiteName1 di agire come una casa sito

Quello che ho provato finora, è qualcosa di simile alla risposta fornita da @cheesemacfly here:

<rules> 
    <rule name="Redirect if SiteName1" stopProcessing="true"> 
     <match url="^SiteName1/(.*)$" /> 
     <action type="Redirect" url="{R:1}" /> 
    </rule> 
    <rule name="Rewrite to sub folder"> 
     <match url="^.*$" /> 
     <action type="Rewrite" url="SiteName1/{R:0}" /> 
    </rule> 
</rules> 

E le grandi opere per Case1 & 2 ma non gli altri.

Ho provato ad aggiungere regole come questo, ma non era successo ...

<rule name="if_not_SiteName1" stopProcessing="true"> 
    <match url="^SiteName1/(.*)$" negate="true" /> 
    <action type="None" /> 
</rule> 
+0

Si sta utilizzando un sistema di routing? Perché se no, potresti essere in grado di utilizzare la condizione 'IsFile/IsDirectory' (quindi se il percorso richiesto, assumiamo' http: // localhost/SiteName2/default.aspx' o 'http: // localhost/SiteName2 /' , punta a un vero file/cartella, quindi non si attiva la regola). Funzionerebbe nel tuo caso? – cheesemacfly

+0

@cheesemacfly Uso il routing, questi sono i siti MVC ASP .Net. Ho aggiornato la mia domanda. – MaxSC

risposta

3

penso che la soluzione migliore sarebbe quella di attivare la regola di riscrittura hai già solo quando l'url doesn' t inizia con una delle tue sotto-applicazioni.

Sarebbe qualcosa di simile:

<rules> 
    <rule name="Redirect if SiteName1" stopProcessing="true"> 
     <match url="^SiteName1/(.*)$" /> 
     <action type="Redirect" url="{R:1}" /> 
    </rule> 
    <rule name="Rewrite to sub folder"> 
     <match url="^(SiteName2|SiteName3|SiteName4)/" negate="true" /> 
     <action type="Rewrite" url="SiteName1/{R:0}" /> 
    </rule> 
</rules> 

Manteniamo il reindirizzamento quando viene richiesta SiteName1/ (non abbiamo bisogno di cambiare questo), ma la regola di riscrittura viene attivato solo quando l'URL richiesto non lo fa iniziare con SiteName2/ o SiteName3/ o SiteName4/ (è ciò che significa url="^(SiteName2|SiteName3|SiteName4)/" e si utilizza negate="true" per attivare la regola solo quando il modello è non corrisponde a corrispondente).

+0

Grazie, fa il trucco! Ma sarebbe possibile non dover specificare '(SiteName2 | SiteName3 | SiteName4)' e creare solo regole basate su 'SiteName1' solo? Dovrò occuparmi di diversi set di SiteName (a volte solo "SiteName2" e "SiteName4", a volte "2", "3" e "5") a seconda del server web. Voglio evitare di scrivere set di regole specifici per diverse farm di server Web, poiché l'unica cosa comune sarà sempre la regola "SiteName1". Grazie! – MaxSC

+0

Vedo il vostro punto, cercherò di pensare a una soluzione e modificare la mia risposta se trovo una buona :) – cheesemacfly

+0

Apprezzo molto! – MaxSC