it-swarm.com.de

Ersetzen IIS Regeln in web.config umwandeln

Ich habe einige IIS Regeln zum Umschreiben, die ich je nach Umgebung variieren möchte. Die Regeln zum Entwickeln der Entwicklung befinden sich in der Datei web.config. Am Ende der Datei web.test.config habe ich:

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

Meine App-Einstellungen werden bei der Bereitstellung zu Testzwecken geändert. Mit IIS gelten jedoch keine Regeln zum Umschreiben. Ich hatte gehofft, der gesamte <rewrite>-Abschnitt würde einfach durch den in der Transformationsdatei ersetzt werden (wie unter http://msdn.Microsoft.com/en-us/library/dd465326.aspx ), aber nichts ändert sich .

Ich habe auch versucht, xdt:Transform="Replace" xdt:Locator="Match(name)"> auf die einzelnen Regeln zu setzen:

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

Dies macht aber auch keinen Unterschied.

Kann man in der web.config sogar die Regeln für das Umschreiben ersetzen, und wenn ja, was fehlt mir?

44
LDJ

Da ich in meiner web.config keine Regeln zum Umschreiben hatte, funktionierte die Replace-Transformation nicht. Ich habe die Insert-Transformation wie folgt erfolgreich verwendet:

  <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

Der Umschreibungsabschnitt hat mir beim Erstellen der Release-Konfigurationen, Fehler und Abschnitte, die überhaupt nicht angezeigt werden, seltsam funktioniert. So habe ich es gelöst. 

Microsoft (R) Build Engine-Version 12.0.31101.0 

Microsoft .NET Framework, Version 4.0.30319.0

Edit Nachdem ich mich damit beschäftigt hatte, wurde mir klar, dass der Webserver einen Fehler verursacht, wenn er das Rewwrite-Tag auf einem Server hat, auf dem das Rewrite-Plugin nicht vorhanden ist. Ich werde keine unterschiedlichen Konfigurationen auf dem Server und dem lokalen Entwicklungscomputer verwenden.

Die nicht transformierte web.config benötigt nur ein Tag und in der web.config.release für eine grundlegende kanonische Hostnamenregel

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

Die Aktion benötigte überhaupt keinen Namen, aber das Umschreib-Tag benötigte das xdt: Transform = "Insert".

Wenn Sie es auch auf Ihrem lokalen Computer haben möchten, ist ein Update erforderlich.

7
Crypth

Hier gibt es viele Antworten mit Beispielen, was eine gute Sache ist, aber ich denke, dass einige Details fehlen. Ich habe in meiner website darüber geschrieben, der Schlüsselpunkt hier ist das Hinzufügen von xdt:Transform="Insert" in der Root-Tag-Hierarchie, die Sie für die jeweilige Umgebung hinzufügen möchten. 

Standardmäßig haben Sie Ihre Datei "Web.config", aber Sie haben auch "Web.Debug.config" und "Web.Release.config", wie in der folgenden Abbildung dargestellt:

 enter image description here

Nehmen wir an, Sie möchten in Ihrer Version der Anwendung eine Umleitung von http zu https hinzufügen. Bearbeiten Sie dann Web.Release.config und fügen Sie folgende Zeilen hinzu:

<?xml version="1.0"?>

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

Das nächste Mal, wenn Sie Ihr Projekt veröffentlichen, wird das Tag mit der Option "Rewrite" und dessen Unterinhalt der Datei "web.config" hinzugefügt.

Um dies vor dem Veröffentlichen anzuzeigen, klicken Sie mit der rechten Maustaste auf Web.Release.config und klicken Sie auf Preview Transform.

 enter image description here

Sie werden den Unterschied zwischen der ursprünglichen Version und der Release-Version sehen.

 enter image description here

Referenz: 

Haftungsausschluss: Der Link zu dieser Richtlinie bezieht sich auf meine persönliche Website.

Es ist möglich, den Überschreibabschnitt von system.webServer umzuwandeln. Ich hatte anfangs das gleiche Problem und stellte fest, dass ich den Umschreibungsknoten versehentlich falsch unter system.web platziert hatte. Das sieht zwar nicht nach Ihrem Problem aus, das auf dem eingeschränkten Snippet basiert, das Sie angegeben haben, aber ich vermute immer noch, dass Ihr Problem mit der Platzierung von Knoten in der Transformationsdatei zusammenhängt.

So sieht meine Web.Debug.config aus (und diese Version schreibt die korrekte Web.config in einem Debug-Build):

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

Ein Trick, den ich benutze, ist, der Aktion einen Namen zu geben
dann fügen Sie in meiner Transformation einfach xdt:Transform="SetAttributes" xdt:Locator="Match(name)" wie folgt hinzu

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

Das obige Beispiel ist das Hinzufügen von www zu allen Anfragen

-------AKTUALISIEREN-----

nur ein Update, das der Aktion einen Namen hinzufügt, funktioniert nicht wie gewünscht. Daher habe ich den Code wie folgt aktualisiert 

 <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