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 по умолчанию.
Инструкции
Создание виртуального каталога
Откройте диспетчер служб 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.
В области Подключения разверните узел Имя сервера, Узлы, Веб-сайт, к которому требуется добавить виртуальный каталог, а затем выберите приложение, в которое требуется добавить виртуальный каталог.
В области Действия щелкните Просмотреть виртуальные каталоги нажмите кнопку Добавить виртуальный каталог...
В диалоговом окне Добавление виртуального каталога введите как минимум сведения в текстовые поля Псевдоним: и Физический путь: и нажмите кнопку ОК.
Примечание
Щелкните Подключиться как... , чтобы настроить сервер для использования указанных учетных данных при доступе к содержимому в виртуальном каталоге, и нажать кнопку Параметры тестирования... , чтобы проверить параметры проверки подлинности и авторизации для виртуального каталога.
Конфигурация
Элемент <virtualDirectory>
можно настроить на уровне сервера, сайта и приложения в файле ApplicationHost.config.
Атрибуты
Атрибут | Описание | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
allowSubDirConfig |
Дополнительный логический атрибут. Указывает, ищет ли службы IIS Web.config файлы в каталогах содержимого ниже текущего уровня (true) или не ищет Web.config файлы в каталогах содержимого ниже текущего уровня (false). Значение по умолчанию — true . |
||||||||||
logonMethod |
Необязательный атрибут перечисления. Указывает метод входа для виртуального каталога. Атрибут logonMethod может иметь одно из следующих возможных значений. Значение по умолчанию — ClearText .
|
||||||||||
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
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по