none
同一物理ディレクトリに異なる仮想ディレクトリを設定した場合の既定のドキュメント RRS feed

  • 質問

  • Windows Server 2019 StandardのIIS10にて、同一物理ディレクトリに対し複数の異なる仮想ディレクトリを設定した場合、それぞれの仮想ディレクトリにおいて異なる既定のドキュメントが設定できずにいます。
    設定できない場合の対処案を一応実装済ですので実害は回避できているのですが、できればこの方法に拠らずに正攻法で実現したいと考えております。

    さまざまなサイトを検索してみていますが、同一物理ディレクトリに対し複数の異なる仮想ディレクトリを設定するという事例自体、該当するものがヒットせず、余程イレギュラな使用方法なのかと思われてしまうところですが、Windows Server 2003 R2 Standard SP2のIIS6ではできていた設定です。


    どうかお知恵をお貸し下さい。

    【実現したいこと】
    仮想ディレクトリA:物理ディレクトリ(F:\...\web\)
    仮想ディレクトリB:同上

    仮想ディレクトリAの既定のドキュメント:F:\...\web\topA.html
    仮想ディレクトリBの既定のドキュメント:F:\...\web\topB.html

    【発生する現象】
    片方の仮想ディレクトリにて既定のドキュメントを設定すると他方の仮想ディレクトリの既定のドキュメントにも同じドキュメントが自動的に設定されます。
    例えば、仮想ディレクトリAの既定のドキュメントにtopA.htmlを設定しますと、仮想ディレクトリBの既定のドキュメントにもtopA.htmlが設定されます。

    【設定できない場合の対処案】
    既定のドキュメントを一本化し、当該ドキュメント内で、アクセスしてきたURLを解析しURLに応じそれぞれ設定したかったドキュメントへリダイレクトする。

    仮想ディレクトリAの既定のドキュメント:top.html
    仮想ディレクトリBの既定のドキュメント:同上

    top.html内にて
    仮想ディレクトリAに対するアクセスならtopA.htmlへリダイレクト
    仮想ディレクトリBに対するアクセスならtopB.htmlへリダイレクト

    2020年7月21日 11:28

回答

  • 既定のドキュメントの設定を含んだ既存のweb.configが存在する場合、機能の委任で既定のドキュメントを「読み取り専用」に設定すると、仰るような問題が生じるようです。混乱させてしまい、申し訳ありません。

    IISマネージャーで機能の委任を開き、既定のドキュメントを選択してから「継承にリセット」をクリックすると、「読み取り専用」の設定を取り消すことができます。

    さて、読み取り専用の設定をせずにapplicationHost.configにlocationタグを追加するには、次のようにします。

    IISマネージャーの「構成エディター」を使用する方法

    1. IISマネージャーの仮想ディレクトリレベルで「構成エディター」を開きます。
    2. セクションを「system.webServer/defaultDocument」、場所を「ApplicationHost.config <location=仮想ディレクトリのパス>」に変更します。
    3. filesの行をクリックし、「(Count=数値)」と書かれている欄の右端にある「...」ボタンをクリックします。
    4. コレクションエディターで必要な編集をし、終わったらコレクションエディターを閉じます。
    5. 「適用」をクリックします。

    別の仮想ディレクトリも同じように設定します。
    もしweb.configに競合する設定が残っている場合は、忘れずに削除して下さい。

    改めて、最初の返信時の説明がまずかった点を補足しますと、「1.サーバーレベルで『機能の委任』を開き、既定のドキュメントの設定を『読み取り専用』に変更します~」の手順は必須ではありません。これはIISマネージャーでlocationタグを設定する方法の一つにすぎず、今回ご提案した方法で代替できます。実際ご都合には合わないようですので、無視して頂いて差し支えありません。この手順を無視していただければ、全仮想ディレクトリの再設定も不要になると思います。

    applicationHost.configに設定を適用することもご心配の種になってしまっているかもしれませんが、locationタグをweb.configに構成しても(手元の環境で試した限りでは)うまく動作しないようです。

    ドキュメントの件は、locationタグの件でしたら、最初の返信でご紹介したリンクの他に、Deep Dive into IIS Configuration with IIS 7 and IIS 8 にも目を通されるとよいと思います。

    設定を元に戻す件については、探してみましたが適切なものが見つかりませんでした。

    • 回答としてマーク nat muse 2020年7月31日 2:42
    2020年7月27日 14:50

すべての返信

  • 既定のドキュメントをIISマネージャーで設定すると、設定内容は既定でweb.configファイルに保存されます。物理パスが同じ場合、双方が同じweb.configファイルを共有することになり、結果として同じ設定が共有されることになります。

    この状況を避けるには、(applicationHost.config内で)locationタグを使用します。Getting Started with Configuration in IIS 7 and Above には次のように説明があります。

    ----------

    In some cases, there is no alternative for using location tags:

    • Two or more virtual paths mapped to same physical folder. Obviously, if the two virtual paths have different configuration, it cannot be specified in a web.config file because it is shared.

    ----------

    手元のWindows Server 2019 Standardで試したところ、IISマネージャーでは次の手順で設定できました。

    1. サーバーレベルで「機能の委任」を開き、既定のドキュメントの設定を「読み取り専用」に変更します。
    2. 各仮想ディレクトリで、既定のドキュメントを設定します。

    PowerShellの場合は、Add-WebConfiguration 等のコマンドに「-Location <サイトから仮想ディレクトリへのパス>」と「-PSPath IIS:\」を付けて実行すると、applicationHost.configにlocationタグを使用した設定が書き込まれます。

    ご参考になれば幸いです。

    2020年7月23日 23:03
  • ご回答ありがとうございます。

    物理ディレクトリ内にweb.configが作成されているのを見つけておりまして、「物理パスが同じ場合、双方が同じweb.configファイルを共有する」であろうと推測され、半ば諦めていたところでした。

    applicationHost.configの件、お手元の実機でわざわざ事前ご確認頂きありがとうございます。ご教示の方法によりチャレンジしてみます。実施次第、改めて結果ご報告させて頂きます。

    ありがとうございました。

    2020年7月25日 6:28
  • 実施報告です。

    ご教示頂きました方策1.の[サーバーレベル]-[機能の委任]-[既定のドキュメントの設定」を「読み取り専用」に変更してみましたところ、方策2.を実施する時点で少々やっかいな状況となることが分かりました。


    質問内容がIIS全体に影響が及ぶとは想定しておらずお伝えする必要はないかと考えておりましたが、IISの全体構成についてご説明致します。

    default web siteをドメインルート(www.・・・.jp)とし、これ以下に複数の仮想ディレクトリ(e.g. www.・・・.jp/XXX、www.・・・.jp/YYY、www.・・・.jp/ZZZ)を構成し、ドメインルートを含め各仮想ディレクトリ毎に既定のドキュメントを設定しております。default web siteには弊社のHPを設置し、default web site以下の仮想ディレクトリは弊社の事業・プロジェクト毎に設けてきたことから、総数で約50程度あります。この内、質問のように同一物理ディレクトリを指す仮想ディレクトリは現在のところ3つです。

    default web siteの他、サブドメイン(e.g. abc.・・・.jp、def.・・・.jp)も設け、弊社コラボ主体のHP等も運用しております。

    さて、上記の少々やっかいな状況と申しますのは、IISマネージャにて、[既定のドキュメントの設定」を「読み取り専用」に変更しますと、仮想ディレクトリAに既定のドキュメントを設定しようとする際に、ドメインルート(・・・.jp)に対応するweb.configが開けない旨のエラーが発生するようになる、というものです。

    サーバーレベルで」とのご教示より、本サーバのIIS全体がweb.configを使用しなくなるのではといった推察がついてはおりましたものの、この推察に符合するエラー(書き込みモードでのファイルオープンができないと推察)のように見えます。

    エラーを無視して、全仮想ディレクトリに既定のドキュメントを設定し直せば、エラーも発生しなくなり既定のドキュメントも運用できるようになるようには思われるのですが、仮想ディレクトリの総数が多いだけに躊躇されるところです。

    加えましてweb.configを使用するのが標準的な使用方法であるところ、わずか3つのために全体の方式も併せて変更を要するという点や全仮想ディレクトリに既定のドキュメントを設定し直す以前の状態へ戻す方法が不明(applicationHost.configをバックアップしておきリストアすれば済む?)という点も躊躇の要因となっています。

    誠に恐縮ですが、確証を得るために参考となりますドキュメントをご紹介頂けないでしょうか?

    約50のサイトやサブドメインは既に本稼動中でありますことご察し頂ければ幸いでございます。

    2020年7月27日 7:03
  • 既定のドキュメントの設定を含んだ既存のweb.configが存在する場合、機能の委任で既定のドキュメントを「読み取り専用」に設定すると、仰るような問題が生じるようです。混乱させてしまい、申し訳ありません。

    IISマネージャーで機能の委任を開き、既定のドキュメントを選択してから「継承にリセット」をクリックすると、「読み取り専用」の設定を取り消すことができます。

    さて、読み取り専用の設定をせずにapplicationHost.configにlocationタグを追加するには、次のようにします。

    IISマネージャーの「構成エディター」を使用する方法

    1. IISマネージャーの仮想ディレクトリレベルで「構成エディター」を開きます。
    2. セクションを「system.webServer/defaultDocument」、場所を「ApplicationHost.config <location=仮想ディレクトリのパス>」に変更します。
    3. filesの行をクリックし、「(Count=数値)」と書かれている欄の右端にある「...」ボタンをクリックします。
    4. コレクションエディターで必要な編集をし、終わったらコレクションエディターを閉じます。
    5. 「適用」をクリックします。

    別の仮想ディレクトリも同じように設定します。
    もしweb.configに競合する設定が残っている場合は、忘れずに削除して下さい。

    改めて、最初の返信時の説明がまずかった点を補足しますと、「1.サーバーレベルで『機能の委任』を開き、既定のドキュメントの設定を『読み取り専用』に変更します~」の手順は必須ではありません。これはIISマネージャーでlocationタグを設定する方法の一つにすぎず、今回ご提案した方法で代替できます。実際ご都合には合わないようですので、無視して頂いて差し支えありません。この手順を無視していただければ、全仮想ディレクトリの再設定も不要になると思います。

    applicationHost.configに設定を適用することもご心配の種になってしまっているかもしれませんが、locationタグをweb.configに構成しても(手元の環境で試した限りでは)うまく動作しないようです。

    ドキュメントの件は、locationタグの件でしたら、最初の返信でご紹介したリンクの他に、Deep Dive into IIS Configuration with IIS 7 and IIS 8 にも目を通されるとよいと思います。

    設定を元に戻す件については、探してみましたが適切なものが見つかりませんでした。

    • 回答としてマーク nat muse 2020年7月31日 2:42
    2020年7月27日 14:50
  • ご連絡遅くなりまして大変恐縮でございます。緊急の別件で2~3日手が離せずにおりました。

    ご説明、理解できたと思います。

    いくつかのリファレンスドキュメントを手がかりに、applicationHost.configに追加されるであろうタグ内容とIISの動作について当たりを付けました。この理解が正しければ、期待される結果が得られるであろうと納得されます。

    リカバリーショットにつきましては、確かにドキュメントが見つけられません。applicationHost.configの事前バックアップ取得、万一の場合には当該ディレクトリを再作成、という方針で腹を決めました。

    実施後、改めてご報告させて頂きます。

    2020年7月31日 1:03
  • 実施報告です。

    成功致しました。ご指導・ご鞭撻ありがとうございます。

    C:\Windows\System32\inetsrv\Config\applicationHost.configに下記が追加定義されることを確認致しました。
        <location path="Default Web Site/仮想ディレクトリ名">
            <system.webServer>
                <defaultDocument>
                    <files>
                        <add value="既定のドキュメントファイル名" />
                    </files>
                </defaultDocument>
            </system.webServer>
        </location>

    また、当該物理ディレクトリのweb.configは別名へリネームしておきました。

    2020年7月31日 2:51