Могу ли я создать "исключение" для виртуального каталога 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 документ для деталей.