2014-08-30 16 views
17

Sto tentando di impostare una regola di riscrittura dell'URL di IIS in modo che corrisponda a 403 risposte come risultato del tentativo di navigazione in una directory quando la navigazione nella directory è disabilitata. Voglio quindi reindirizzarli alla solita pagina degli errori personalizzati di ASP.NET che ho definito per 404s.Impossibile modificare il codice di risposta IIS con URL Riscrivere la regola in uscita

Ecco quello che ho attualmente:

<outboundRules> 
    <!-- By default, browsing a directory with no default resource will return 403 --> 
    <rule name="Directory browsing location"> 
    <match serverVariable="RESPONSE_LOCATION" pattern="(.*)" /> 
    <conditions> 
     <add input="{RESPONSE_STATUS}" pattern="^403" /> 
    </conditions> 
    <action type="Rewrite" value="/Error/PageNotFound?aspxerrorpath={PATH_INFO}"/> 
    </rule> 
    <rule name="Directory browsing status code" patternSyntax="ExactMatch"> 
    <match serverVariable="RESPONSE_STATUS" pattern="403" /> 
    <action type="Rewrite" value="302" /> 
    </rule> 
</outboundRules> 

La mia ipotesi è che ha bisogno di essere una regola di uscita e che ho bisogno di riscrivere sia il codice di stato e aggiungere l'intestazione posizione di risposta, anche se quest'ultimo wouldn Esistono comunque con la risposta originale 403.

Il comportamento al momento è ... niente. Sto ancora vedendo 403s, non importa quanto tweaking che faccio. Qualche idea là fuori?

Per inciso, no, non ci sono nessun 403 legittimi sul sito che potrebbero essere inghiottiti come risultato di questo. Potrei anche creare in entrata regole per ogni percorso che potrebbe comportare il soddisfacimento della condizione, ma non è molto scalabile.

risposta

9

URL Rewrite ha una maniglia su quasi tutto, ma non il codice di stato HTTP poiché è esterno all'intestazione della risposta. Quindi sfortunatamente URL Rewrite non può fare nulla con questo, o almeno non che io abbia mai potuto trovare. Ho voluto fare cose simili molte volte. Nota, puoi controllare lo stato con una condizione usando {RESPONSE_STATUS}, ma non puoi aggiornarlo.

La risposta di @RyanCEI è ciò che consiglierei. Per aggiungere a ciò, è possibile utilizzare subStatusCode per portare l'errore a soli 403,14 e, solo per il test, assicurarsi di eseguire il test off-box o impostare errorMode su Custom poiché, per impostazione predefinita, IIS non mostrerà l'errore personalizzato pagine quando si esegue il test nella casella locale.

Ecco un esempio di configurazione che fa entrambi.

<httpErrors errorMode="Custom"> 
     <error statusCode="403" subStatusCode="14" path="/errorpage.htm" responseMode="ExecuteURL" /> 
    </httpErrors> 

Dopo il test è possibile disattivare errorMode = "Custom".

1

Mi ricordo con SharePoint quando abbiamo avuto questo problema siamo entrati nel registrar di domini per i nostri nomi di dominio e abbiamo messo i record DNS per inoltrare le cose (penso che fossero record CNAME). Era un disastro mantenere tutto sincronizzato, ma era l'unico modo per farlo funzionare. HTTP e URL riscrivono in IIS non ha funzionato in alcuni casi con SharePoint almeno.

4

Non sono sicuro se questo aiuta, in quanto non è una regola di riscrittura, ma questo costringerà 403 alla tua pagina di errore utilizzando la sezione httpErrors di web.config:

<configuration> 
    <system.web> 
     <compilation debug="false" targetFramework="4.5" /> 
     <httpRuntime targetFramework="4.5" /> 
     <customErrors defaultRedirect="~/errorpage.html" mode="On"> 
     </customErrors> 
    </system.web> 
    <system.webServer> 
    <httpErrors> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" prefixLanguageFilePath="" path="/errorpage.html" responseMode="ExecuteURL" /> 
     <remove statusCode="403" subStatusCode="-1" /> 
     <error statusCode="403" prefixLanguageFilePath="" path="/errorpage.html" responseMode="ExecuteURL" /> 
    </httpErrors> 
    <defaultDocument> 
     <files> 
     <remove value="default.aspx" /> 
     <remove value="iisstart.htm" /> 
     <remove value="index.htm" /> 
     <remove value="Default.asp" /> 
     <remove value="Default.htm" /> 
     </files> 
    </defaultDocument> 
    </system.webServer> 
</configuration>