我可以为 IIS 虚拟目录创建“例外”吗?

我可以为 IIS 虚拟目录创建“例外”吗?

我的服务器上有一个类似这样的文件夹:

目录:\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。

我在 Windows Server 2000 上运行 IIS 5.0。

这可能吗?谢谢。

答案1

这有点像贫民窟,但它可能是解决问题的一个简单方法。

  • 创建指向 c:\blah 的第二个虚拟目录。
  • 在“blah”虚拟目录(指向 C:\inetpub\wwwroot\blah)中,为 404 错误设置自定义错误处理程序,该错误处理程序是 c:\inetpub\wwwroot\blah\ 中的 ASP 或 ASP.Net 页面
  • 在 404 处理程序 ASP.Net 页面中,
    • 拉取请求的 URL(它应该是 Request.QueryString 中唯一的东西)
    • 删除请求的文件名以外的所有内容
    • 重定向到“/cblah/FILENAME”。

下面是一小段可以充当 404 处理程序的 ASP.Net 代码:

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

答案2

您可能可以通过自定义编写的 ISAPI 过滤器来实现这一点,但我不知道 IIS 或现有产品中是否存在任何可以完全实现您所寻找的方法。

答案3

免疫学与免疫学研究所是一个免费的 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]

您还可以使用通配符“blah”。要做到这一点,您需要一个命名覆盖 vdir 的约定。它看起来像这样:

# 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 文档了解详情。

相关内容