Virtual Directory <virtualDirectory>

Общие сведения

Элемент <virtualDirectory> является дочерним элементом <application> элемента и управляет параметрами конфигурации для определенного виртуального каталога. Виртуальный каталог — это имя каталога (также называемое путем), которое указывается в iis 7 и сопоставляется с физическим каталогом на локальном или удаленном сервере. Имя виртуального каталога становится частью URL-адреса приложения, и пользователи могут запрашивать URL-адрес из браузера для доступа к содержимому в физическом каталоге, например веб-странице или списку дополнительных каталогов и файлов. Если указать имя, отличное от имени физического каталога для виртуального каталога, пользователям будет сложнее обнаружить фактическую физическую структуру файлов на сервере, так как URL-адрес не сопоставляется непосредственно с корнем сайта.

В IIS 7 каждое приложение должно иметь виртуальный каталог, известный как корневой виртуальный каталог, и сопоставлять приложение с физическим каталогом, содержащим содержимое приложения. Однако приложение может иметь несколько виртуальных каталогов. Например, вы можете использовать виртуальный каталог, если требуется, чтобы приложение включало изображения из другого расположения в файловой системе, но не хотите перемещать файлы изображений в физический каталог, сопоставленный с корневым виртуальным каталогом приложения.

Совместимость

Версия Примечания
IIS 10.0 Элемент <virtualDirectory> не был изменен в IIS 10.0.
IIS 8,5 Элемент <virtualDirectory> не был изменен в IIS 8.5.
IIS 8,0 Элемент <virtualDirectory> не был изменен в IIS 8.0.
IIS 7,5 Элемент <virtualDirectory> не был изменен в IIS 7.5.
IIS 7.0 Элемент <virtualDirectory> появился в IIS 7.0.
IIS 6,0 Элемент <virtualDirectory> заменяет объекты метабазы IIsWebVirtualDir и IIsWebDirectory IIS 6.0.

Настройка

Элемент <virtualDirectory> включен в установку iis 7 по умолчанию.

Инструкции

Создание виртуального каталога

  1. Откройте диспетчер служб IIS.

    • Если вы используете Windows Server 2012 или Windows Server 2012 R2:

      • На панели задач щелкните диспетчер сервера, инструменты, а затем диспетчер служб IIS.
    • Если вы используете Windows 8 или Windows 8.1:

      • Удерживая нажатой клавишу Windows, нажмите букву X и щелкните панель управления.
      • Щелкните Администрирование, а затем дважды щелкните диспетчер служб IIS.
    • Если вы используете Windows Server 2008 или Windows Server 2008 R2:

      • На панели задач нажмите кнопку Пуск, наведите указатель на пункт Администрирование, а затем щелкните Диспетчер служб IIS.
    • Если вы используете Windows Vista или Windows 7:

      • На панели задач нажмите кнопку Пуск, а затем выберите пункт панель управления.
      • Дважды щелкните элемент Администрирование, а затем дважды щелкните диспетчер служб IIS.
  2. В области Подключения разверните узел Имя сервера, Узлы, Веб-сайт, к которому требуется добавить виртуальный каталог, а затем выберите приложение, в которое требуется добавить виртуальный каталог.
    Снимок экрана: панель

  3. В области Действия щелкните Просмотреть виртуальные каталоги нажмите кнопку Добавить виртуальный каталог...

  4. В диалоговом окне Добавление виртуального каталога введите как минимум сведения в текстовые поля Псевдоним: и Физический путь: и нажмите кнопку ОК.
    Снимок экрана: диалоговое окно

    Примечание

    Щелкните Подключиться как... , чтобы настроить сервер для использования указанных учетных данных при доступе к содержимому в виртуальном каталоге, и нажать кнопку Параметры тестирования... , чтобы проверить параметры проверки подлинности и авторизации для виртуального каталога.

Конфигурация

Элемент <virtualDirectory> можно настроить на уровне сервера, сайта и приложения в файле ApplicationHost.config.

Атрибуты

Атрибут Описание
allowSubDirConfig Дополнительный логический атрибут.

Указывает, ищет ли службы IIS Web.config файлы в каталогах содержимого ниже текущего уровня (true) или не ищет Web.config файлы в каталогах содержимого ниже текущего уровня (false).

Значение по умолчанию — true.
logonMethod Необязательный атрибут перечисления.

Указывает метод входа для виртуального каталога.

Атрибут logonMethod может иметь одно из следующих возможных значений. Значение по умолчанию — ClearText.
Значение Описание
Batch Этот тип входа предназначен для серверов пакетной службы, где процессы могут выполняться от имени пользователя без прямого вмешательства пользователя.

Числовое значение равно 1.
ClearText Этот тип входа сохраняет имя и пароль в пакете проверки подлинности, что позволяет серверу устанавливать подключения к другим сетевым серверам при олицетворении клиента.

Числовое значение равно 3.
Interactive Этот тип входа предназначен для пользователей, которые будут использовать компьютер в интерактивном режиме.

Числовое значение равно 0.
Network Этот тип входа предназначен для высокопроизводительных серверов, которые проверяют подлинность паролей в виде открытого текста. Учетные данные не кэшируются для этого типа входа.

Числовое значение равно 2.
password Необязательный строковый атрибут.

Указывает пароль, связанный с именем пользователя.

Примечание. Чтобы избежать сохранения незашифрованных строк паролей в файлах конфигурации, всегда используйте AppCmd.exe или диспетчер IIS для ввода паролей. При использовании этих средств управления строки паролей будут зашифрованы автоматически перед записью в XML-файлы конфигурации. Это обеспечивает лучшую защиту паролей, чем хранение незашифрованных паролей.
path Необязательный строковый атрибут.

Указывает виртуальный путь к виртуальному каталогу.
physicalPath Необязательный строковый атрибут.

Указывает физический путь к виртуальному каталогу.
userName Необязательный строковый атрибут.

Указывает имя пользователя учетной записи, которая может получать доступ к файлам конфигурации и содержимому этого виртуального каталога.

Дочерние элементы

Отсутствует.

Образец конфигурации

В следующем примере конфигурации отображается <site> элемент, содержащий два приложения. Первый <application> элемент определяет корневое приложение для сайта, а также корневой виртуальный каталог для приложения. Второй <application> элемент содержит параметры конфигурации для приложения CRM на веб-сайте. Атрибут path определяет путь к приложению. Этот <application> элемент содержит два <virtualDirectory> элемента. Первый определяет корневой виртуальный каталог для приложения, а второй — виртуальный каталог 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>

Пример кода

В следующих примерах создается приложение с именем ShoppingCart с корнем виртуального каталога C:\Inetpub\Contoso\ShoppingCart для сайта с именем Contoso.

Примечание

При создании приложения из командной строки или скрипта необходимо явно создать корневой виртуальный каталог для приложения.

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

Примечание

При использовании AppCmd.exe для настройки этих параметров для параметра apphostфиксации необходимо задать значение . Это зафиксирует параметры конфигурации в соответствующем разделе расположения в файле ApplicationHost.config.

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 IsNull(value) Then
               value = CStr(value)
            End If
            If Not value = CStr(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