Назад | Перейти на главную страницу

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

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

C: \ inetpub \ wwwroot \ blah

В 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.

Это возможно? Спасибо.

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

  • Создайте второй виртуальный каталог, указывающий на 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 Rewriter, который может проверять наличие каталога перед перезаписью. Правила будут выглядеть так:

# 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 для подробностей.