web-dev-qa-db-ja.com

IIS仮想ディレクトリのリダイレクトURL

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でそれを行うための正しい方法は何ですか?

14
Jouni

実際、それほど簡単ではありませんが、それほどひどいことではありません。

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)テスト。

29
James Skemp

これが発生している理由は、デフォルトではすべてのルール設定が親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>
2
XpertSiji