Могу ли я создать "исключение" для виртуального каталога IIS?

У меня есть папка на моем сервере, как эта:

C: \ Inetpub \ Wwwroot \ бла

В IIS у меня также есть настроенная виртуальная папка "/blah", указывающая на C:\BLAH

Естественно, когда посетители сайта вводят http://www.myserver.com/blah/test.html, IIS ищет C:\BLAH\test.html, а не C: \ inetpub \ wwwroot \ blah \ test.html. По большей части, это поведение, которое я хочу, потому что большинство файлов находятся в C:\BLAH. Однако, когда файл существует в C: \ inetpub \ wwwroot \ blah, я бы хотел, чтобы сервер сначала его там нашел, а затем заглянул в C:\BLAH, если не нашел. По сути, я бы хотел, чтобы файлы в C: \ inetpub \ wwwroot \ blah были "исключением" из виртуального каталога. Пусть сервер вернет файлы из этой папки, если они существуют, но если они не извлекают их из C:\BLAH вместо возврата 404.

Я использую IIS 5.0 на Windows Server 2000.

Это возможно? Благодарю.

3 ответа

Решение

Это своего рода гетто, но это может быть простой способ решить вашу проблему.

  • Создайте второй виртуальный каталог, который указывает на c:\blah.
  • В виртуальном каталоге "blah" (который указывает на C:\inetpub\wwwroot\blah) установите настраиваемый обработчик ошибок для 404 ошибок, который является страницей ASP или ASP.Net в c:\inetpub\wwwroot\blah\
  • На странице обработчика 404 ASP.Net
    • вытащить запрошенный URL (он должен быть единственным в Request.QueryString)
    • отрубить все, кроме запрашиваемого имени файла
    • перенаправить на "/cblah/FILENAME".

Вот небольшой фрагмент кода ASP.Net, который может выступать в качестве обработчика 404:

string qs = Page.Request.QueryString.ToString();
qs = Server.UrlDecode(qs);
int c = qs.LastIndexOf("/");
string filepath = qs.Substring(c+1);
Response.Redirect("/cblah/"+filepath);

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

IIRF - это бесплатный перезаписывающий URL, который может проверять наличие каталога перед перезаписью. Правила будут выглядеть так:

# This rule matches, eg, http://server/blah/test.html
# It does "no rewrite" (-) if the file c:\blah\test.html does NOT exist. 
# The url stub /blah must map to an existing vdir. 
RewriteCond  c:\blah\$1        !-f
RewriteRule  ^/blah/(.*)$      -  [L]

# If the file does exist, rewrite to the alternative vdir. 
RewriteCond  c:\blah\$1           -f
RewriteRule  ^/blah/(.*)$         /override-vdir/$2    [L]

Вы также можете подстановочный знак "бла". Чтобы сделать это, вам нужно соглашение о присвоении имен переопределить vdirs. Это будет выглядеть примерно так:

# This rule matches, eg, http://server/blah/test.html
# It does nothing if the file c:\blah\test.html does not exist. 
RewriteCond  c:\$1\$2           !-f
RewriteRule  ^/([^/]+)/(.*)$    -  [L]

RewriteCond  c:\$1\$2            -f
RewriteRule  ^/([^/]+)/(.*)$    /override-$1/$2    [L]

Существуют также условия для проверки существования каталога. Проверьте IIRF документ для деталей.

Другие вопросы по тегам