La riscrittura degli URL con UrlRewritingNet non riesce con un + char nell'URL
-
26-09-2019 - |
Domanda
Sto usando UrlRewritingNet in Umbraco per fare un po 'URL di base riscrittura degli URL di prodotto e di categoria. Tutto va bene sulla mia macchina locale (Visual Studio dev-server web) e sul nostro server di sviluppo interno (Window Server 2008 con ISS 7, 32 bit). Ma non riesce sul server di produzione, che è Windows Server 2008 R2 con IIS 7 (64 bit). Il sintomo è che la regola di riscrittura non viene attivato. Il server mi dà semplicemente un errore 404.
La regola di riscrittura aspetto:
<add name="CategoryRewrite"
virtualUrl="^/products/(.*)/(.*).aspx"
rewriteUrlParameter="ExcludeFromClientQueryString"
destinationUrl="~/default.aspx?umbPage=1&maincategory=$1&subcategory=$2"
ignoreCase="true"/>
L'aspetto URL come il seguente - questo non funziona:
http://example.net/products/category+name/sub+category.aspx
Se cambio l'URL al seguente funziona in tutte e 3 ambienti:
http://example.net/products/category%20name/sub%20category.aspx
E 'chiaro che la regex nell'attributo virtualUrl non riesce quando il + viene utilizzato per il carattere spazio. Ma devo ammettere, che io riesco a capire il motivo per cui l'espressione regolare non solo sul server di Windows 2008 R2.
sto cercando approfondimenti sulle quali differenze tra Windows Server 2008 R2 e gli altri 2 ambienti. Cosa devo cercare?
mi hanno confermato che lo System.Web.RegularExpressions.dll è la stessa versione sui server.
Soluzione
Il problema è che il filtro di richiesta di IIS7 rifiuta URL contenenti caratteri +. La soluzione è aggiungere il seguente a voi web.config:
<configuration>
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>
</configuration>
Per ulteriori informazioni: http: //blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx
Un collega ha la brillante idea di eseguire il sito web sul proprio IIS. E poi l'errore è stato ulteriormente definito come 404.11, e da lì su una soluzione era semplice.
Altri suggerimenti
Questo sembra strano per me perché la tua regex trova anche i caratteri '+'. Forse il problema è a causa del primo carattere della regex, inizio stringa '^' che si sta utilizzando. Forse sul server di produzione si ottiene un URL assoluto e sul server ambiente dev un URL relativo passato nel modulo di riscrittura.