Remplacer les règles de réécriture IIS dans le web.config transformer

j'ai quelques IIS règles de réécriture que je veux varier en fonction de l'environnement. Les règles de réécriture du développement sont sur le web.fichier de configuration, puis à la fin du web.test.fichier de configuration j'ai:

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

Mes paramètres app se transforment lorsque je me déploie pour tester, mais par IIS les règles de réécriture ne le sont pas. J'espérais que toute la section <rewrite> serait simplement remplacée par celle du fichier transform (selon http://msdn.microsoft.com/en-us/library/dd465326.aspx ), mais rien ne change.

j'ai essayé de mettre xdt:Transform="Replace" xdt:Locator="Match(name)"> sur les 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 web.config et si oui, qu'est-ce que je rate?

42
demandé sur GEOCHET 2012-08-08 11:01:45

5 réponses

comme je n'avais pas de règles de réécriture dans mon web principal.config, la transformation de remplacement n'a pas fonctionné. J'ai utilisé avec succès L'Insert transform, 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>
43
répondu StuartQ 2013-11-27 18:05:52

la section de réécriture a fonctionné bizarrement pour moi au début lors de la création de la version configs, des erreurs et des sections qui n'apparaissent pas du tout. C'est comment je l'ai résolu.

Microsoft (R) Construire la version du Moteur 12.0.31101.0

Microsoft. NET Framework, version 4.0.30319.0

Edit après avoir joué avec cela, j'ai réalisé que d'avoir la balise de réécriture sur un serveur qui ne ne pas avoir le plugin de réécriture faire le webserver retourner une erreur. Je ne veux pas de configurations différentes sur le serveur et la machine locale de développement Donc la solution est:

de L'onu transformées web.config n'a besoin que d'une étiquette et sur le web.config.de presse pour une base canonique nom d'hôte de la règle

<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 besoin d'un nom mais la balise de réécriture a besoin de XDT: Transform= "Insert"

évidemment si vous le voulez sur votre machine locale de plus, il faudrait une mise à jour à la place.

7
répondu Crypth 2015-06-10 09:12:03

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

par défaut vous avez votre Web.fichier de configuration, mais vous avez aussi Web.Débogage.config et Web.Publier.config comme vu dans l'image ci-dessous:

enter image description here

Permet de dire que vous voulez ajouté une redirection http vers https dans votre version de l'application. Puis éditer le Web.Publier.config et ajouter les lignes suivantes:

<?xml version="1.0"?>

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

ainsi la prochaine fois que vous publiez votre projet la balise avec réécriture et son Sous-contenu sera ajouté au web.fichier de configuration.

pour voir qu'avant de publier, cliquez sur le bouton droit de la souris sur le site web.Publier.de configuration et cliquez sur Aperçu Transformer.

enter image description here

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

enter image description here

référence:

avertissement: le lien de cette ligne directrice se référer à mon site web personnel.

3
répondu maytham-ɯɐɥʇʎɐɯ 2018-03-24 16:22:41

il est possible de transformer la section de réécriture du système.serveur web. J'avais initialement le même problème et j'ai réalisé que j'avais placé par inadvertance le noeud de réécriture incorrectement sous le système.Web. Bien que cela ne ressemble pas à votre problème basé sur l'extrait limité que vous avez fourni, je soupçonne toujours que votre problème est lié au placement de noeud dans le fichier transform.

voici ce que ma toile.Débogage.config ressemble (et cette version est écrit le Web correct.config sur une version debug):

<?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
répondu J.R. Armstrong 2012-08-25 13:42:08

une astuce que j'utilise est de donner à l'action un nom

puis dans ma transformation il suffit d'ajouter xdt:Transform="SetAttributes" xdt:Locator="Match(name)" comme la suivante

<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 est d'ajouter www à toutes les requêtes

-------mise à JOUR-----

juste une mise à jour ajouter un nom à l'action ne fonctionnera pas comme souhaité donc 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
répondu Mshtawythug 2015-03-02 17:05:23