У меня на сервере есть такая папка:
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.
Это возможно? Спасибо.
Это своего рода гетто, но это может быть простой способ решить вашу проблему.
Вот небольшой фрагмент кода 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 для подробностей.