web-dev-qa-db-fra.com

Remplacement IIS réécrire les règles dans la transformation web.config

J'ai certaines règles de réécriture IIS que je souhaite varier en fonction de l'environnement. Les règles de réécriture de développement sont dans le fichier web.config, puis à la fin du fichier web.test.config, j'ai:

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

Les paramètres de mes applications sont transformés lorsque je déploie pour tester, mais par IIS, les règles de réécriture ne le sont pas. J'espérais que la totalité de la section <rewrite> serait simplement remplacée par celle du fichier de transformation (comme indiqué dans http://msdn.Microsoft.com/en-us/library/dd465326.aspx ), mais rien ne change. .

J'ai aussi essayé d'ajouter xdt:Transform="Replace" xdt:Locator="Match(name)"> aux règles individuelles:

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

Mais encore une fois, cela ne fait aucune différence.

Est-il même possible de remplacer les règles de réécriture dans le fichier web.config et si oui, que me manque-t-il?

44
LDJ

Comme je n'avais pas de règles de réécriture dans mon web.config principal, la transformation Remplacer ne fonctionnait pas. J'ai utilisé avec succès la transformation Insert, comme ci-dessous:

  <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>
45
StuartQ

La section de réécriture a fonctionné étrangement pour moi au début lors de la création des modifications de configuration, des erreurs et des sections non affichées. Voici comment je l'ai résolu. 

Microsoft (R) Build Engine version 12.0.31101.0 

Microsoft .NET Framework, version 4.0.30319.0

Edit Après avoir déconné avec cela, j’ai réalisé qu’avoir la balise de réécriture sur un serveur qui ne dispose pas du plug-in de réécriture fait que le serveur Web renvoie une erreur. Je ne souhaite pas utiliser différentes configurations sur le serveur et la machine de développement local. Le correctif est le suivant:

Le fichier web.config non transformé nécessite uniquement une balise et dans le fichier web.config.release pour une règle de nom d'hôte canonique de base

<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>

L'action n'avait pas du tout besoin de nom, mais la balise rewrite avait besoin de xdt: Transform = "Insert"

De toute évidence, si vous le souhaitez également sur votre ordinateur local, une mise à jour est nécessaire.

7
Crypth

Il y a beaucoup de réponses ici avec des exemples, ce qui est une bonne chose, mais je pense qu'il manque peu de détails. J'ai écrit à ce sujet dans mon website , le point clé ici est d'ajouter xdt:Transform="Insert" dans la hiérarchie de balises racine que vous souhaitez ajouter pour l'environnement respectif. 

Par défaut, vous avez votre fichier Web.config, mais vous avez également Web.Debug.config et Web.Release.config, comme le montre l'image ci-dessous:

 enter image description here

Disons que vous souhaitez ajouter une redirection de http à https dans votre version de l'application. Ensuite, éditez Web.Release.config et ajoutez les lignes suivantes:

<?xml version="1.0"?>

.....
  <system.webServer>
    <rewrite xdt:Transform="Insert">
      <rules>
        ......
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Ainsi, lors de la prochaine publication de votre projet, la balise avec réécriture et son sous-contenu seront ajoutés au fichier web.config.

Pour voir cela avant de publier, cliquez avec le bouton droit sur Web.Release.config, puis cliquez sur Aperçu de la transformation.

 enter image description here

Vous verrez la différence entre la version initiale et la version finale.

 enter image description here

Référence: 

Déni de responsabilité: le lien de cette ligne directrice renvoie à mon site Web personnel.

5

Il est possible de transformer la section de réécriture de system.webServer. Au début, j'avais le même problème et je me suis rendu compte que j'avais par inadvertance placé le nœud de réécriture de manière incorrecte sous system.web. Bien que cela ne ressemble pas à votre problème en fonction de l'extrait limité que vous avez fourni, je soupçonne toujours que votre problème est lié au placement du nœud dans le fichier de transformation.

Voici à quoi ressemble mon Web.Debug.config (et cette version écrit le bon Web.config sur une version de débogage):

<?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>
1
J.R. Armstrong

Un truc que j'utilise est de donner un nom à l'action
puis dans ma transformation, il suffit d'ajouter xdt:Transform="SetAttributes" xdt:Locator="Match(name)" comme suit

<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>

L'exemple ci-dessus consiste à ajouter www à toutes les demandes.

-------METTRE À JOUR-----

juste une mise à jour en ajoutant le nom à l'action ne fonctionnera pas comme souhaité, alors j'ai mis à jour le code comme suit 

 <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>
0
Mshtawythug