asp.net - studio - ¿Cómo puedo hacer que la reescritura de URL funcione con la transformación web.Release.config?
web config production or development (4)
La transformación solo ocurrirá si coloca los atributos adecuados de xdt
en los elementos que necesitan transformarse. Intente agregar un xdt:Transform
a su configuración de lanzamiento:
<system.webServer xdt:Transform="Replace">
<!-- the rest of your element goes here -->
</system.webServer>
Eso le dirá al motor de transformación que todo el elemento system.webServer
de Web.config
necesita ser reemplazado por el de Web.Release.config
.
El motor de transformación ignorará silenciosamente cualquier elemento que no tenga atributos xdt
.
Enlace obligatorio a MSDN .
Tengo una regla de reescritura web.config especificada para mover todo el tráfico a https. La regla funciona, pero no quiero que se requiera SSL mientras estoy depurando. Tengo un montón de transformaciones web.release.config que ya se están realizando y que funcionan en la publicación, así que decidí poner una regla de reescritura allí. El problema es que la regla de reescritura no se está transformando como el resto de la configuración. Aquí está la configuración de web.config:
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true"/>
<rewrite></rewrite>
</system.webServer>
Y aquí está la transformación que se está haciendo:
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect HTTP to HTTPS" stopProcessing="true">
<match url="(.*)"/>
<conditions>
<add input="{HTTPS}" pattern="^OFF$"/>
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther"/>
</rule>
</rules>
</rewrite></system.webServer>
Si solo copio la regla de reescritura en web.config, funciona bien. ¿Alguien tiene alguna idea de por qué las transformaciones web.Release.config no funcionan solo para esta sección?
Otro camino a seguir sería poner en una condición de reescritura que niega si estás en localhost:
<conditions>
<add input="{HTTP_HOST}" pattern="localhost" negate="true"/>
</conditions>
Resumiendo otras respuestas aquí, descubrimos lo obvio: "Reemplazar" solo reemplazará un nodo, no "Insertarlo" (gracias a DigitalD por la pista correcta). El resto de nuestros archivos de transformación se reemplazan, por lo que optamos por una etiqueta vacía en nuestra base web.config (la que se transforma).
<system.webServer>
...other tags here that do not get transformed...
<rewrite />
</system.webServer>
Idealmente, habría "sobrescribir" que insertaría o reemplazaría (o eliminar e insertar).
<system.webServer>
<rewrite>
<rules xdt:Transform="Replace">
<clear />
<rule name="Redirect HTTP to HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="localhost(:/d+)?" negate="true" />
<add input="{HTTP_HOST}" pattern="127/.0/.0/.1(:/d+)?" negate="true" />
<add input="{HTTPS}" pattern="OFF" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther" />
</rule>
</rules>
</rewrite>
</system.webServer>