跑步IIS 7
我在共享主机账户上运行,我的服务器上有一个名为的文件,+.jpg
但当我尝试通过 URL 导航到它时
http://example.com/images/%2b.jpg
服务器没有正确响应,我的浏览器返回“未找到网页”错误。
在我的开发机器上,这工作正常。我应该告诉我的托管商启用什么选项,以便接受此类 URL?
答案1
看起来该问题是由双重转义序列引起的 404.11 错误:
HTTP 错误 404.11 - 未找到 请求过滤模块配置为拒绝包含双重转义序列的请求。
并详细说明知识库文章。
运行此命令:
Appcmd set config "Default Web Site" /section:system.webServer/Security/requestFiltering -allowDoubleEscaping:True
允许提供文件。
对于您来说,您可以将此部分添加到应用程序的 web.config 中:
<requestFiltering allowDoubleEscaping="true" />
如本文所述TechNet 文章。
答案2
加号 (+) 是每个RFC2396:
许多 URI 包含由某些特殊字符组成或分隔的组件。这些字符被称为“保留字符”,因为它们在 URI 组件中的使用仅限于其保留用途。如果 URI 组件的数据与保留用途相冲突,则必须在形成 URI 之前对冲突的数据进行转义。
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
"$" | ","
Wade Hilmo 有一篇很棒的文章,标题为IIS 如何阻止 URL 中的字符。提供了很多信息和背景。具体针对加号的部分如下:
因此 allowDoubleEscaping/VerifyNormalization 看起来非常简单。为什么我说它会引起混淆?问题是当 URL 中出现“+”字符时。“+”字符似乎没有被转义,因为它不涉及“%”。此外,RFC 2396 将其标记为保留字符,当其为转义形式 (%2b) 时可以包含在 URL 中。但是,如果将 allowDoubleEscaping 设置为其默认值 false,我们将阻止它,即使以转义形式也是如此。这样做的原因是历史性的:早在 HTTP 的早期,“+”字符被认为是空格字符的简写。一些规范化器在给定包含“+”的 URL 时会将其转换为空格。因此,我们认为 URL 中的“+”是非规范的。我找不到任何引用 RFC 来调用这种“+”处理,但网络上有许多参考资料将其视为历史行为。
根据我自己的经验,我知道当 IIS 记录请求时,空格会被替换为加号。名称中包含加号可能会在解析日志时造成混淆。
有三种方法可以解决这个问题,还有两种方法可以继续使用加号。
allowDoubleEscaping=true
- 这将允许对整个网站/应用程序进行双重转义。根据内容的不同,这可能至少是不可取的。以下命令将设置allowDoubleEscaping=true
。appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /allowDoubleEscaping:True
alwaysAllowedUrls
- 请求过滤提供白名单方法。通过将该 URL 路径添加到 alwaysAllowedUrls,该请求将不会被任何其他请求过滤设置检查,并继续在 IIS 请求管道中运行。这里需要注意的是,请求过滤不会检查以下请求:
- 请求限制:maxContentLength、maxUrl、maxQueryString
- 动词
- 查询 - 不会检查查询字符串参数
- 双重转义
- 高位字符
- 请求过滤规则
- 请求标头限制
以下命令将添加/+.jpg
到alwaysAllowedUrls
默认网站。
appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"alwaysAllowedUrls.[url='/+.jpg']"
- 改名- 是的,如果可能的话,只需重命名文件/文件夹。这是最简单的解决方案。