原因:
正如您已经展示了 IIS 配置的快照。这些是 .Net 应用程序中保留的文件夹和文件,因此 IIS 想要保留这些以确保安全。
包含这些字符串的 URL 作为 404 响应返回,前提是这些字符串出现在之前?
并且恰好在 2 个斜杠之间/../
或最后。例如:www.example.com/bin/anything.ext或www.example.com/folder/sub/web.config
IIS 在任何地方都可以匹配这些字符串,因为我们可以在任何目录级别使用 web.config。
如果这些字符串有任何内容,那么页面将由 IIS 提供。例如:www.example.com/bin-folder/anthing.ext或www.example.com/sub/bin.html或www.example.com/-web.confing/page.aspx都可以。
我建议在这些字符串中使用一些其他词,或者在带有扩展名的 URL 末尾使用,这样它就不会出现在两个斜杠之间。
例如:www.example.com/en-web.config/1
或www.example.com/en/1/web.config.aspx
即使那样我也有一个棘手的解决方案:
如果您真的需要这些字符串,而 URL 中没有其他词,那么我建议您使用use URL-ReWrite.
. 这可能整体上并不快,但除了第 2 步之外它快速方便,因为第 2 步取决于您的应用程序。
1-在顶级的 IIS 中添加此规则:
正则表达式匹配:(/web|^web)\.(config$|config/) //OR as your requirement
重新写入:handler.aspx?url={REQUEST_URI}
<rule name="web-config" stopProcessing="true">
<match url="(/web|^web)\.(config$|config/)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="Rewrite" url="handler.aspx?url={REQUEST_URI}" appendQueryString="false" />
</rule>
2-在handler.aspx
(或任何其他语言页面)检查url
GET 变量并做出相应的响应。Request.QueryString("url")
- 小心操作,因为您在这里控制着安全性。
- 我建议仅将实际页面内容包含在响应中,
handler.aspx or handler.php
而不是重定向等。
- 在包含内容之前首先验证 URL(通过正则表达式等),并包含硬编码的内容,不要将 URL 的任何部分放入变量中,并在 response-inclusion-code 中使用该变量。
3-最后从 IIS 管理器中,在特定网站中转到请求过滤->隐藏段选项卡并删除所需字符串。例如:web.config。这一步也可以通过 web.config 完成:
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="209715200" />
<hiddenSegments>
<remove segment="web.config" />
</hiddenSegments>
</requestFiltering>
</security>
现在,IIS 将为页面提供服务,您的处理程序页面将在用户浏览器中显示具有完全相同 URL 的输出。