仮想ディレクトリ <virtualDirectory>

  • 概要
  • 互換性
  • セットアップ
  • 方法
  • 構成
  • サンプル コード

※本ページに挿入されている画像をクリックすると、画像全体が別ウィンドウで表示されます。

概要

<virtualDirectory> 要素は <application> 要素の子要素であり、特定の仮想ディレクトリの構成設定を制御します。仮想ディレクトリは、インターネット インフォメーション サービス (IIS) 7.0 で指定するディレクトリ名 (パスとも言います) で、ローカル サーバーまたはリモート サーバー上の物理ディレクトリにマップします。仮想ディレクトリ名はアプリケーションの URL の一部になり、ユーザーは、ブラウザーからこの URL を要求してWeb ページや追加ディレクトリやファイルのリストといった物理ディレクトリ内のコンテンツにアクセスできます。仮想ディレクトリ名に物理ディレクトリと異なる名前を指定すると、URL がサイトのルートに直接マップしないので、ユーザーがサーバーの実際の物理ファイル構造を知るのが難しくなります。

IIS 7.0 では、各アプリケーションが仮想ディレクトリ (ルート仮想ディレクトリと呼びます) を持つ必要があります。この仮想ディレクトリは、アプリケーションを、そのアプリケーションのコンテンツがある物理ディレクトリにマップします。ただし、1 つのアプリケーションが複数の仮想ディレクトリを持つことができます。たとえば、アプリケーションにファイル システム内の別の場所にあるイメージを含めたいが、アプリケーションのルート仮想ディレクトリにマップされた物理ディレクトリにそのイメージ ファイルを移動させたくない場合に、別の仮想ディレクトリを使用できます。

互換性

  IIS 7.0 IIS 6.0
説明 <virtualDirectory> は IIS 7.0 で新たに導入された要素です。

<virtualDirectory> 要素は、IIS 6.0 のメタベース オブジェクト IIsWebVirtualDir および IIsWebDirectory に代わるものです。

セットアップ

<virtualDirectory> 要素は、IIS 7.0 の既定のインストールに含まれています。

方法

新しい仮想ディレクトリを作成する方法

  1. [スタート] ボタン、[管理ツール][インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。

  2. [接続] ウィンドウで、対象のサーバー名、[サイト]、仮想ディレクトリを追加する Web サイトの順に展開します。次に、仮想ディレクトリの追加先のアプリケーションをクリックします。

    拡大

  3. [操作] ウィンドウで [仮想ディレクトリの表示] をクリックし、[仮想ディレクトリの追加] をクリックします。

  4. [仮想ディレクトリの追加] ダイアログ ボックスで、少なくとも [エイリアス] ボックスと [物理パス] ボックスに情報を入力して [OK] をクリックします。

    拡大

    : 仮想ディレクトリ内のコンテンツへのアクセス時に指定された資格情報を使用するようにサーバーを構成するには、[接続] をクリックします。仮想ディレクトリの認証および承認の設定をテストするには、[テスト設定] をクリックします。

構成

<virtualDirectory> 要素は、ApplicationHost.config ファイル内で、サーバー、サイト、およびアプリケーション レベルで構成できます。

属性

属性 説明
allowSubDirConfig オプションの Boolean 属性。

True の場合は、IIS は現在の階層より下のコンテンツ ディレクトリで Web.config ファイルを検索し、False の場合は、現在の階層より下のコンテンツ ディレクトリで Web.config ファイルを検索しません。

既定値は true です。
logonMethod オプションの enum 属性。

仮想ディレクトリのログオン方法を指定します。

logonMethod 属性には、次のいずれかの値を指定できます既定値は ClearText です。

---------------------------------------------------------------------------------------------------------

値: Batch

説明:

  • このログオンの種類は、ユーザーの直接的な介入なしに、ユーザーの代理としてプロセスを実行するバッチ サーバー用です。
  • 数値は 1 です。

値: ClearText

説明:

  • このログオンの種類では、認証パッケージに名前とパスワードを保存します。それによって、サーバーがクライアントになりすまして、他のネットワーク サーバーに接続できるようになります。
  • 数値は 3 です。

値: Interactive

説明:

  • このログオンの種類は、コンピューターを対話的に使用するユーザー用です。
  • 数値は 0 です。

値: Network

説明:

  • このログオンの種類は、プレーンテキストのパスワードを認証する高パフォーマンス サーバー用です。このログオンの種類では、資格情報はキャッシュされません。
  • 数値は 2 です。
password オプションの string 属性。

ユーザー名に関連付けられるパスワードを指定します。

注 : 暗号化されていないパスワード文字列が構成ファイルに保存されないようにするために、必ず AppCmd.exe または IIS マネージャーを使用してパスワードを入力してください。これらの管理ツールを使用すると、パスワード文字列は自動的に暗号化されてから XML 構成ファイルに書き込まれます。そのため、暗号化されていないパスワードを保存するよりも、パスワードのセキュリティが強化されます。
path オプションの string 属性。

仮想ディレクトリの仮想パスを指定します。
physicalPath オプションの string 属性。

仮想ディレクトリの物理パスを指定します。
userName オプションの string 属性。

この仮想ディレクトリの構成ファイルとコンテンツにアクセスできるアカウントのユーザー名を指定します。

子要素

なし。

構成サンプル

次の構成例は、2 つのアプリケーションを含む <site> 要素を示しています。最初の <application> 要素では、そのサイトのルート アプリケーションと、そのアプリケーションのルート仮想ディレクトリを定義しています。2 番目の <application> 要素には、その Web サイト上の CRM アプリケーションの構成設定が含まれています。path 属性によって、アプリケーションのパスを定義しています。この <application> 要素には、2 つの <virtualDirectory> 要素が含まれています。最初の要素では、アプリケーションのルート仮想ディレクトリを定義しています。2 番目の要素では、アプリケーションの Images 仮想ディレクトリを定義しています。

<site name="Contoso" id="2" serverAutoStart="true">
   <application path="/">
      <virtualDirectory path="/" physicalPath="C:\Contoso\Content" />
   </application>
   <application path="/CRM">
      <virtualDirectory path="/" physicalPath="C:\Contoso\Content\CRM" />

      <virtualDirectory path="/Images" physicalPath="E:\Images" />
   </application>
   <bindings>
      <binding protocol="http" bindingInformation="*:80:www.contoso.com" />
   </bindings>
</site>

サンプル コード

次の例では、Contoso という名前のサイトに、ShoppingCart という名前の新しいアプリケーションを作成し、このアプリケーションのルート仮想ディレクトリとして C:\Inetpub\Contoso\ShoppingCart を指定しています。

: コマンド プロンプトまたはスクリプトからアプリケーションを作成する場合は、そのアプリケーションのルート仮想ディレクトリを明示的に作成する必要があります。

AppCmd.exe

appcmd.exe set config -section:system.applicationHost/sites /+"[name='Contoso'].[path='/ShoppingCart']" /commit:apphost

appcmd.exe set config -section:system.applicationHost/sites /+"[name='Contoso'].[path='/ShoppingCart'].[path='/',physicalPath='C:\Inetpub\Contoso\ShoppingCart']" /commit:apphost

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetApplicationHostConfiguration();
         ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
         ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
         ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"Contoso");

         if (siteElement == null) throw new InvalidOperationException("Element not found!");

         ConfigurationElementCollection siteCollection = siteElement.GetCollection();
         ConfigurationElement applicationElement = siteCollection.CreateElement("application");

         applicationElement["path"] = @"/ShoppingCart";
         ConfigurationElementCollection applicationCollection = applicationElement.GetCollection();
         ConfigurationElement virtualDirectoryElement = applicationCollection.CreateElement("virtualDirectory");
         virtualDirectoryElement["path"] = @"/";
         virtualDirectoryElement["physicalPath"] = @"C:\Inetpub\Contoso\ShoppingCart";
         applicationCollection.Add(virtualDirectoryElement);
         siteCollection.Add(applicationElement);

         serverManager.CommitChanges();
      }
   }

   private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
   {
      foreach (ConfigurationElement element in collection)
      {
         if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
         {
            bool matches = true;
            for (int i = 0; i < keyValues.Length; i += 2)
            {
               object o = element.GetAttributeValue(keyValues[i]);
               string value = null;
               if (o != null)
               {
                  value = o.ToString();
               }
               if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
               {
                  matches = false;
                  break;
               }
            }
            if (matches)
            {
               return element;
            }
         }
      }
      return null;
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample
   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetApplicationHostConfiguration
      Dim sitesSection As ConfigurationSection = config.GetSection("system.applicationHost/sites")
      Dim sitesCollection As ConfigurationElementCollection = sitesSection.GetCollection
      Dim siteElement As ConfigurationElement = FindElement(sitesCollection, "site", "name", "Contoso")

      If (siteElement Is Nothing) Then
         Throw New InvalidOperationException("Element not found!")
      End If

      Dim siteCollection As ConfigurationElementCollection = siteElement.GetCollection
      Dim applicationElement As ConfigurationElement = siteCollection.CreateElement("application")
      applicationElement("path") = "/ShoppingCart"
      Dim applicationCollection As ConfigurationElementCollection = applicationElement.GetCollection
      Dim virtualDirectoryElement As ConfigurationElement = applicationCollection.CreateElement("virtualDirectory")
      virtualDirectoryElement("path") = "/"
      virtualDirectoryElement("physicalPath") = "C:\Inetpub\Contoso\ShoppingCart"
      applicationCollection.Add(virtualDirectoryElement)
      siteCollection.Add(applicationElement)

      serverManager.CommitChanges()
   End Sub

   Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
      For Each element As ConfigurationElement In collection
         If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
            Dim matches As Boolean = True
            Dim i As Integer
            For i = 0 To keyValues.Length - 1 Step 2
               Dim o As Object = element.GetAttributeValue(keyValues(i))
               Dim value As String = Nothing
               If (Not (o) Is Nothing) Then
                  value = o.ToString
               End If
               If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
                  matches = False
                  Exit For
               End If
            Next
            If matches Then
               Return element
            End If
         End If
      Next
      Return Nothing
   End Function

End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST");
var sitesCollection = sitesSection.Collection;
var siteElementPos = FindElement(sitesCollection, "site", ["name", "Contoso"]);

if (siteElementPos == -1) throw "Element not found!";

var siteElement = sitesCollection.Item(siteElementPos);
var siteCollection = siteElement.Collection;
var applicationElement = siteCollection.CreateNewElement("application");
applicationElement.Properties.Item("path").Value = "/ShoppingCart";
var applicationCollection = applicationElement.Collection;
var virtualDirectoryElement = applicationCollection.CreateNewElement("virtualDirectory");
virtualDirectoryElement.Properties.Item("path").Value = "/";
virtualDirectoryElement.Properties.Item("physicalPath").Value = "C:\\Inetpub\\Contoso\\ShoppingCart";
applicationCollection.AddElement(virtualDirectoryElement);
siteCollection.AddElement(applicationElement);

adminManager.CommitChanges();

function FindElement(collection, elementTagName, valuesToMatch) {
   for (var i = 0; i < collection.Count; i++) {
      var element = collection.Item(i);
      if (element.Name == elementTagName) {
         var matches = true;
         for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
            var property = element.GetPropertyByName(valuesToMatch[iVal]);
            var value = property.Value;
            if (value != null) {
               value = value.toString();
            }
            if (value != valuesToMatch[iVal + 1]) {
               matches = false;
               break;
            }
         }
         if (matches) {
            return i;
         }
      }
   }
   return -1;
}

VBScript

Set adminManager = CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST")
Set sitesCollection = sitesSection.Collection
siteElementPos = FindElement(sitesCollection, "site", Array("name", "Contoso"))

If (siteElementPos = -1) Then
   WScript.Echo "Element not found!"
   WScript.Quit
End If

Set siteElement = sitesCollection.Item(siteElementPos)
Set siteCollection = siteElement.Collection
Set applicationElement = siteCollection.CreateNewElement("application")
applicationElement.Properties.Item("path").Value = "/ShoppingCart"
Set applicationCollection = applicationElement.Collection
Set virtualDirectoryElement = applicationCollection.CreateNewElement("virtualDirectory")
virtualDirectoryElement.Properties.Item("path").Value = "/"
virtualDirectoryElement.Properties.Item("physicalPath").Value = "C:\Inetpub\Contoso\ShoppingCart"
applicationCollection.AddElement(virtualDirectoryElement)
siteCollection.AddElement(applicationElement)

adminManager.CommitChanges()

Function FindElement(collection, elementTagName, valuesToMatch)
   For i = 0 To CInt(collection.Count) - 1
      Set element = collection.Item(i)
      If element.Name = elementTagName Then
         matches = True
         For iVal = 0 To UBound(valuesToMatch) Step 2
            Set Property = element.GetPropertyByName(valuesToMatch(iVal))
            value = property.Value
            If Not value = Null Then
               value = CStr(value)
            End If
            If Not value = valuesToMatch(iVal + 1) Then
               matches = False
               Exit For
            End If
         Next
         If matches Then
            Exit For
         End If
      End If
   Next
   If matches Then
      FindElement = i
   Else
      FindElement = -1
   End If
End Function