IIS 7.0)で仮想ディレクトリのリダイレクトURLを設定するにはどうすればよいですか?最新のURL書き換えモジュール2.xをインストールしました。
私の問題を例で説明できます:
IIS 7.0サーバー、www.mysite.comにWebサイトがあります。Webサイトのルートディレクトリを指す仮想ディレクトリ "sales"をサイトの下に作成することにしました。今、私はvdirのリダイレクトURLを作成します。vdirは、サイトのルートと同じ仮想ルートディレクトリを指しています。
大きなアイデアは、www.mysite/salesにアクセスして、www.mysite.com?productid = 200に自動的にリダイレクトすることです。
(ウェブサイトではなく)vdirの書き換えURLでリダイレクトしようとしましたが、常に次のエラーメッセージが表示されます。
Cannot add duplicate collection entry of type 'rule' with unique key
attribute 'name' set to "test".
これは、仮想vdirをポイントしてルールを追加しようとすると発生します。
Webサイトレベルにルールを追加できますが、ルールが機能しません。 「www.mysite/sales」というURLで次のエラーが発生します。キーが一意であることを知っています。 web.configから確認しました。
この種の機能は、IIS 6.0では非常に簡単に使用できました。マウスでvdirをポイントし、プロパティを設定して、URLにリダイレクトします。
IIS 7.0でそれを行うための正しい方法は何ですか?
実際、それほど簡単ではありませんが、それほどひどいことではありません。
1)仮想ディレクトリの代わりに物理ディレクトリを作成します。
2)HTTPリダイレクトの役割サービスがあることを確認します。 http://www.iis.net/ConfigReference/system.webServer/httpRedirect を参照してください
3)IIS Managerを開き、リダイレクトする物理ディレクトリを参照します。
4)IISの下の[HTTPリダイレクト]アイコンをダブルクリックします。
5)[この宛先にリクエストをリダイレクトする]チェックボックスをオンにして、新しいURLを入力します( http://example.com/newPage.html )
6)必要に応じて次の2つのボックスをチェックします。通常は両方を確認する必要があります。
7)適用ボタンを押します。
8)Webサイトを選択し、[Webサイトの管理]で[再起動]を選択します。
9)テスト。
これが発生している理由は、デフォルトではすべてのルール設定が親Webアプリケーションから継承されるためです。したがって、ルートWebサイト内で定義されたルールがある場合、それは階層内の後続のすべての子Webサイトに継承されます。クリアされない限り。
たとえば、IISアプリケーション階層が次のような場合、
Default Web Site(Root)
| Webアプリケーション1(VDir1) | Webサブアプリケーション11(VDir2)
| Webアプリケーション2(VDir3)
「Test」という名前のルールは、ルートアプリケーションに存在する場合、Webアプリケーション1、Webアプリケーション11、およびWebアプリケーション2に継承されます。
あなたの場合、Webアプリケーション11(VDir2)は物理的に(VDir1)と同じ場所にあります。したがって、IIS構成は同じWeb.configファイルを共有するため、両方のディレクトリで同じです。
したがって、Web.configファイルに追加された新しいルールは、これらの仮想ディレクトリ(VDir1およびVDir2)の両方に自動的に適用されます。また、ルールはデフォルトで継承されるため、IISのルールエンジンは、ルールが継承によって既に存在しているため、ルールの解析中に問題を検出します。
可能な解決策は、web.configファイル内にルールを追加する前に<Clear />タグを追加して、継承されたルールをクリアすることです。
<rewrite>
<rules>
<clear/>
<rule name="test" stopProcessing="true">
<match xxx />
<action xxx />
</rule>
</rules>
</rewrite>
ただし、継承された構成に追加する必要のあるルールのみを削除するよりも、<Remove name = 'Rule Name' />タグの方が望ましいと思います。これにより、ルートWebサイトの他のすべてのルールが階層内で確実に継承されます。この新しいルールのみが(一種の)上書きされます。
<rewrite>
<rules>
<remove name="test"/>
<rule name="test" stopProcessing="true">
<match xxx />
<action xxx />
</rule>
</rules>
</rewrite>