with request_uri net http_host example asp asp.net iis url-rewriting web-config transform

asp.net - request_uri - web config rewrite condition



Reemplazar las reglas de reescritura de IIS en la transformación web.config (5)

Aquí hay muchas respuestas con ejemplos, lo cual es bueno, pero creo que faltan algunos detalles. He escrito sobre esto en mi website , el punto clave aquí es agregar xdt:Transform="Insert" en la jerarquía de etiquetas raíz que desea agregar para el entorno respectivo.

Por defecto tiene su archivo Web.config, pero también tiene Web.Debug.config y Web.Release.config como se ve en la imagen a continuación:

Digamos que desea agregar una redirección de http a https en su lanzamiento de la aplicación. Luego edite Web.Release.config y agregue las siguientes líneas:

<?xml version="1.0"?> ..... <system.webServer> <rewrite xdt:Transform="Insert"> <rules> ...... </rules> </rewrite> </system.webServer> </configuration>

Así que la próxima vez que publique su proyecto, la etiqueta con reescritura y su sub-contenido se agregarán al archivo web.config.

Para ver eso antes de publicar, haga clic derecho en Web.Release.config y haga clic en Vista previa Transformar.

Verá la diferencia entre la versión inicial y la versión de lanzamiento.

Referencia:

Descargo de responsabilidad: el enlace de esta guía se refiere a mi sitio web personal.

Tengo algunas reglas de reescritura de IIS que quiero variar según el entorno. Las reglas de reescritura de desarrollo están en el archivo web.config, luego al final del archivo web.test.config que tengo:

<appSettings> ...Some app settings tranforms here </appSettings> <system.webserver> <rewrite xdt:Transform="Replace"> <rules> ... rules here </rules> </rewrite> </system.webserver> </configuration>

La configuración de mi aplicación se está transformando cuando despliegue para probar, pero las reglas de reescritura de IIS no lo están. Esperaba que toda la sección <rewrite> simplemente se reemplazara con la del archivo de transformación (según http://msdn.microsoft.com/en-us/library/dd465326.aspx ), pero nada está cambiando.

He intentado poner xdt:Transform="Replace" xdt:Locator="Match(name)"> en las reglas individuales también:

<rule name="Test rule" stopProcessing="true" xdt:Transform="Replace" xdt:Locator="Match(name)">

Pero nuevamente esto no hace diferencia.

¿Es posible reemplazar las reglas de reescritura en el web.config y, de ser así, qué me estoy perdiendo?


Como no tenía ninguna regla de reescritura en mi web.config principal, la transformación Replace no funcionó. Utilicé con éxito la transformación Insertar, como se muestra a continuación:

<system.webServer> <rewrite xdt:Transform="Insert"> <rules> <rule name="CanonicalHostNameRule1"> <match url="(.*)" /> <conditions> <add input="{HTTP_HOST}" pattern="^www/.mysite/.com$" negate="true" /> </conditions> <action type="Redirect" url="http://www.mysite.com/{R:1}" /> </rule> </rules> </rewrite> </system.webServer>


Es posible transformar la sección de reescritura de system.webServer. Inicialmente estaba teniendo el mismo problema y me di cuenta de que había colocado inadvertidamente el nodo de reescritura incorrectamente en system.web. Si bien esto no se parece a su problema en función del fragmento limitado que proporcionó, aún sospecho que su problema está relacionado con la ubicación del nodo en el archivo de transformación.

Aquí está mi aspecto de Web.Debug.config (y esta versión está escribiendo el Web.config correcto en una compilación de depuración):

<?xml version="1.0"?> <!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 --> <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <!-- In the example below, the "SetAttributes" transform will change the value of "connectionString" to use "ReleaseSQLServer" only when the "Match" locator finds an atrribute "name" that has a value of "MyDB". <connectionStrings> <add name="MyDB" connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> </connectionStrings> --> <system.web> <!-- In the example below, the "Replace" transform will replace the entire <customErrors> section of your web.config file. Note that because there is only one customErrors section under the <system.web> node, there is no need to use the "xdt:Locator" attribute. <customErrors defaultRedirect="GenericError.htm" mode="RemoteOnly" xdt:Transform="Replace"> <error statusCode="500" redirect="InternalError.htm"/> </customErrors> --> </system.web> <system.webServer> <rewrite xdt:Transform="Replace"> <rules> <clear/> <rule name="Canonical Hostname"> <!-- Note that I have stripped out the actual content of my rules for the purposes of posting here... --> </rule> </rules> </rewrite> </system.webServer> </configuration>


La sección de reescritura me resultó extraña al principio al crear las configuraciones de lanzamiento, los errores y las secciones que no se mostraban. Así es como lo resolví.

Microsoft (R) Build Engine versión 12.0.31101.0

Microsoft .NET Framework, versión 4.0.30319.0

Editar Después de jugar con esto, me di cuenta de que tener la etiqueta de reescritura en un servidor que no tiene el complemento de reescritura hace que el servidor web devuelva un error. No quiero configuraciones diferentes en el servidor y la máquina de desarrollo local, así que la solución es:

El web.config no transformado solo necesita una etiqueta y en el web.config.release para una regla de nombre de host canónica básica

<configuration> <system.webServer> <rewrite xdt:Transform="Insert"> <rules> <rule name="CanonicalHostNameRule" xdt:Transform="Insert"> <match url="(.*)" /> <conditions> <add input="{HTTP_HOST}" pattern="^www/.host/.com$" negate="true" /> </conditions> <action type="Redirect" url="http://www.host.com/{R:1}" /> </rule> </rules> </rewrite> </system.webServer> </configuration>

La acción no necesitaba un nombre, pero la etiqueta de reescritura necesita el xdt: Transform = "Insertar"

Obviamente, si lo quieres también en tu máquina local, necesitaría una actualización.


Un truco que uso es darle un nombre a la acción
luego en mi transformación solo agregue xdt:Transform="SetAttributes" xdt:Locator="Match(name)" como el siguiente

<system.webServer> <rewrite> <rules> <rule name="RedirecttoWWW" enabled="true" > <match url="(.*)" /> <conditions> <add input="{HTTP_HOST}" negate="true" pattern="^www/.([.a-zA-Z0-9]+)$" /> </conditions> <action name="AddWWW" type="Redirect" url="http://www.{HTTP_HOST}/{R:0}" appendQueryString="true" redirectType="Permanent" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> </rule> </rules> </rewrite>

El ejemplo anterior es para agregar www a todas las solicitudes

-------ACTUALIZAR-----

solo una actualización agregando un nombre a la acción no funcionará como se quería, así que actualicé el código como el siguiente

<system.webServer> <rule name="RedirecttoWWW" enabled="true" xdt:Transform="RemoveAll" xdt:Locator="Match(name)" > </rule> <rule name="RedirecttoWWW" enabled="true" xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)" > <match url="(.*)" /> <conditions> <add input="{HTTP_HOST}" negate="true" pattern="^www/.([.a-zA-Z0-9]+)$" /> </conditions> <action type="Redirect" url="http://{HTTP_HOST}/{R:0}" appendQueryString="true" redirectType="Permanent" /> </rule> </rules> </rewrite> </system.webServer>