我在 Windows Server 2019 上使用 IIS v10.0.17763.1。几个月前,我能够获取具有隐藏属性的文件。现在这个方法不再起作用,返回 404.9 请求该文件上的 PROPFIND 非常有效。
测试文件本身是一个简单的 test.txt,内容为Hello world
。
日志文件不包含任何有用的信息:
2021-01-22 10:00:07 10.0.20.4 GET /foobar/Configurator/test.txt - 80 foobar\administrator 10.0.20.4 PostmanRuntime/7.15.2 - 404 9 2 1
假设某种 Windows 更新破坏了这种行为,因为 IIS 的配置没有任何变化,并且可以在其他未对 IIS 进行任何更改的(已更新)系统上重现。
PS C:\Users\Administrator.QA> Get-WebConfigurationProperty -PSPath "MACHINE/WEBROOT/APPHOST" -Filter "system.webServer/webdav/authoring/fileSystem" -Location "Default Web Site" -Name "allowHiddenFiles"
ItemXPath : /system.webServer/webdav/authoring/fileSystem
IsInheritedFromDefaultValue : False
IsProtected : False
Name : allowHiddenFiles
TypeName : System.Boolean
Schema : Microsoft.IIs.PowerShell.Framework.ConfigurationAttributeSchema
Value : True
IsExtended : False
PS C:\Users\Administrator.QA> Get-WebConfigurationProperty -PSPath "IIS:\sites\Default Web Site/foobar" -Filter /system.webServer/security/requestFiltering/fileExtensions -Name applyToWebDAV
ItemXPath : /system.webServer/security/requestFiltering/fileExtensions
IsInheritedFromDefaultValue : False
IsProtected : False
Name : applyToWebDAV
TypeName : System.Boolean
Schema : Microsoft.IIs.PowerShell.Framework.ConfigurationAttributeSchema
Value : False
IsExtended : False
PS C:\Users\Administrator.QA> Get-WebConfigurationProperty -PSPath "MACHINE/WEBROOT/APPHOST" -Location "Default Web Site/foobar" -Filter /system.webServer/security/requestFiltering/hiddenSegments -Name applyToWebDAV
ItemXPath : /system.webServer/security/requestFiltering/hiddenSegments
IsInheritedFromDefaultValue : False
IsProtected : False
Name : applyToWebDAV
TypeName : System.Boolean
Schema : Microsoft.IIs.PowerShell.Framework.ConfigurationAttributeSchema
Value : False
IsExtended : False
有什么建议可以解决这个问题吗?或者哪个 Windows 更新可能破坏了它?
我发现了这个:https://docs.microsoft.com/en-us/troubleshoot/iis/hidden-static-files-http-404-access-denied但我不明白这有什么帮助。
更新
在与 Microsoft 支持人员进行一些咨询后,我有两个选择:
- 删除隐藏属性或
- 编写我自己的静态文件处理程序
我得到了关于如何做后者的提示:
静态文件处理程序的当前代码可以在以下位置找到:https://referencesource.microsoft.com/#system.web/StaticFileHandler.cs引发异常的代码是:
// To be consistent with IIS, we won't serve out hidden files
if ((((int)fileInfo.Attributes) & ((int)FileAttributes.Hidden)) != 0) {
throw new HttpException(HttpStatus.NotFound, SR.GetString(SR.File_is_hidden));
}
关于如何创建自定义处理程序的文章可以在https://docs.microsoft.com/en-us/iis/develop/runtime-extensibility/developing-iis-modules-and-handlers-with-the-net-framework
答案1
IIS 不会提供具有隐藏属性的静态文件,从来都不会。IIS 或 Windows 中没有变化。
只需删除文件的属性即可。
任何具有隐藏属性的动态文件仍会提供给客户端,因为它们通过不同的文件处理程序运行。