我的服务器上有一个类似这样的文件夹:
目录:\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 文档了解详情。