web-dev-qa-db-ja.com

web.configトランスフォームのIIS書き換えルールを置き換える

環境によって異なるIIS書き換えルールがいくつかあります。開発の書き換えルールはweb.configファイルにあり、web.test.configファイルの最後にあります:

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

テストにデプロイすると、アプリの設定が変換されますが、IISによる書き換えルールは変換されません。 _<rewrite>_セクション全体が単純に変換ファイルのセクションに置き換えられることを期待していました( http://msdn.Microsoft.com/en-us/library/dd465326.aspx =)、しかし何も変わっていません。

個々のルールにもxdt:Transform="Replace" xdt:Locator="Match(name)">を入れてみました:

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

しかし、これでも違いはありません。

Web.configの書き換えルールを置き換えることは可能ですか?その場合、何が欠けていますか?

46
LDJ

メインweb.configに書き換えルールがなかったため、Replaceトランスフォームは機能しませんでした。次のように、Insertトランスフォームを正常に使用しました。

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

書き換えセクションは、リリース構成、エラー、およびまったく表示されないセクションを作成するときに、最初は奇妙に動作しました。これは私がそれを解決した方法です。

Microsoft(R)Build Engineバージョン12.0.31101.0

Microsoft .NET Framework、バージョン4.0.30319.0

編集これをいじった後、書き換えプラグインを持たないサーバーに書き換えタグがあると、ウェブサーバーがエラーを返すことに気付きました。サーバーとローカル開発者のマシンで異なる構成をしたくないので、修正は次のとおりです。

変換されていないweb.configにはタグが必要で、web.config.releaseには基本的な標準ホスト名ルールが必要です

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

アクションには名前はまったく必要ありませんでしたが、書き換えタグにはxdt:Transform = "Insert"が必要です

もちろん、ローカルマシンでも同様に使用する場合は、代わりに更新が必要になります。

7
Crypth

ここには良い例である多くの回答がありますが、欠落している詳細はほとんどないと思います。これについては website で書きましたが、ここで重要なのはxdt:Transform="Insert"は、それぞれの環境に追加するルートタグ階層内にあります。

デフォルトではWeb.configファイルがありますが、下の画像に示すようにWeb.Debug.configとWeb.Release.configもあります。

enter image description here

アプリケーションのリリースで、httpからhttpsへのリダイレクトを追加するとします。次に、Web.Release.configを編集して、次の行を追加します。

<?xml version="1.0"?>

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

そのため、次回プロジェクトを公開するときに、タグの書き換えとそのサブコンテンツがweb.configファイルに追加されます。

公開する前にこれを確認するには、Web.Release.configを右クリックし、[変換のプレビュー]をクリックします。

enter image description here

初期バージョンとリリースバージョンの違いがわかります。

enter image description here

参照:

免責事項:このガイドラインのリンクは私の個人的なウェブサイトを参照しています。

System.webServerの書き換えセクションを変換することは可能です。最初は同じ問題を抱えていましたが、誤ってsystem.webの下に誤って書き換えノードを配置していたことに気付きました。これは、提供された限られたスニペットに基づいた問題のようには見えませんが、問題はトランスフォームファイル内のノードの配置に関連していると思われます。

Web.Debug.configは次のようになります(このバージョンはデバッグビルドで正しいWeb.configを記述しています)。

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

私が使用するトリックは、アクションに名前を付けることです
その後、私のトランスフォームに次のようにxdt:Transform="SetAttributes" xdt:Locator="Match(name)"を追加するだけです

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

上記の例は、すべてのリクエストにwwwを追加することです

- - - -更新 - - -

アクションに名前を追加するだけの更新は期待どおりに機能しないため、次のようにコードを更新しました

 <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