安装 2026 年 8 月安全更新 (Exchange Server SE(内部版本 15.2.2562.46) )后,匿名发布的 Exchange 日历订阅将停止刷新。 订阅应用程序报告服务器错误,并且 URL 返回 HTTP 500。
更多信息
在 Web 浏览器中打开相同的已发布日历 URL 可以正常工作并返回日历。 服务器根据其 User-Agent 标头对客户端进行分类。 Calendar 应用程序不是 Web 浏览器。 因此,服务器无法识别它们,并将请求路由到 8 月更新禁用的代码路径。 然后请求失败并返回“HTTP 500”消息。
以下客户端受到影响。
| 客户端 | 结果 |
|---|---|
| Microsoft Outlook, Internet 日历订阅 | HTTP 500 |
| iOS 和 macOS 上的 Apple Calendar | HTTP 500 |
| Google Calendar,从 URL 添加日历 | HTTP 500 |
| Mozilla Thunderbird | HTTP 500 |
| 源的任何脚本化或自动使用者 | HTTP 500 |
| Chrome, Edge, Firefox, Safari, Android, Chrome, iOS, Safari | HTTP 200,返回日历 |
解决方法
向 IIS 中的 Exchange 后端 站点添加一个 URL 重写规则。 此规则 layout=premium 附加到 /owa/calendar/ 下的.ics请求。 此操作会选择支持的代码路径,然后还原源。
重要
仅将规则应用于 Exchange 后端 站点。 不要将其应用于“默认网站”,也不要在服务器级别应用,因为在服务器级别,将针对服务器上的每个网站对其进行评估。
注意
两种方法都需要 IIS URL 重写模块。 Exchange Server 安装程序不安装该模块。
若要检查模块是否存在,请运行 Test-Path "$env:windir\System32\inetsrv\rewrite.dll"。
如果未安装该模块,并且您添加了一个 <rewrite> 节到 applicationHost.config,则 IIS 会为整个 Exchange 后端站点返回“HTTP 500.19”,而不仅仅是日历路径。
规则模式匹配 /owa/calendar/ 以下的任何.ics请求。 因此,它还涵盖 reachcalendar.ics 了以相同方式失败的已发布计划源。
在以下部分中使用任一方法。 因为这两种方法都在同一范围内配置相同的规则,所以请选择适合您的更改过程的方法。
方法 A:IIS 管理器
打开 IIS 管理器。 展开服务器,展开 网站,选择“ Exchange 后端”,然后双击“ URL 重写”。
在右侧的“操作”窗格中,选择“添加规则” () ...,在“入站规则”下选择“空白规则”,然后选择“确定”。
输入名称并使用以下值完成 匹配 URL 部分。
字段 值 名称 OWA 发布的日历强制高级布局 请求的 URL 与模式匹配 使用 正则表达式 模式 ^owa/calendar/.+\.ics$忽略大小写 时间
展开 “条件”,单击“ 添加...” ,然后使用以下值完成对话框。 如果请求已带有布局参数,则此条件会让请求处于单独状态。
字段 值 条件输入 {QUERY_STRING}检查是否输入字符串 与模式不匹配 模式 (^|&)layout=
单击“ 确定”后,条件将显示在列表中, 逻辑分组 保留为 “全部匹配”。
展开 “操作” ,并使用以下值完成它。
字段 值 操作类型 重写 重写 URL {R:0}?layout=premium&{QUERY_STRING}追加查询字符串 已清除 停止处理后续规则 时间
重要
清除“ 追加查询字符串 ”复选框。 如果使复选框保持选中状态,IIS 将再次追加原始查询字符串。 这会导致请求具有重复的参数。
在 “操作 ”窗格中,选择 “应用” 以保存规则。
验证规则是否列在 URL 重写 列表中。 展开它以查看条件。
不需要回收应用程序池。 IIS 将自动重新加载配置。
注意
根据服务器的功能委派设置,IIS 管理器将规则写入 applicationHost.config 或 Exchange 后端站点 (%ExchangeInstallPath%\ClientAccess\web.config) 的根 web.config 文件。 这两个位置均有效。 稍后验证或删除规则时,请记住这一点。
方法 B:编辑 applicationHost.config
如果您希望将配置部署为文件更改,例如通过配置管理工具,请使用此方法。
文件:C:\Windows\System32\inetsrv\config\applicationHost.config
备份该文件。
Copy-Item C:\Windows\System32\inetsrv\config\applicationHost.config "C:\Windows\System32\inetsrv\config\applicationHost.config.bak-$(Get-Date -f yyyyMMdd-HHmmss)"找到
<location path="Exchange Back End">元素。 如果它不存在,则在文件的根目录中与其他元素一起<location>创建它。 在内部<system.webServer>添加<rewrite>方块:<location path="Exchange Back End"> <system.webServer> <rewrite> <rules> <rule name="OWA published calendar force premium layout" stopProcessing="true"> <match url="^owa/calendar/.+\.ics$" /> <conditions> <add input="{QUERY_STRING}" pattern="(^|&)layout=" negate="true" /> </conditions> <action type="Rewrite" url="{R:0}?layout=premium&{QUERY_STRING}" appendQueryString="false" /> </rule> </rules> </rewrite> </system.webServer> </location>
重要
保留 appendQueryString="false" 该属性。 属性默认为 true。 因此,如果省略它,IIS 将再次追加原始查询字符串。 这会导致请求具有重复的参数。
重要
必须像此文件中一样 & 编写与号。 在 IIS 管理器中,键入纯文本 &。 但是,因为 applicationHost.config 是 XML,所以必须对字符进行编码。 此处的文字 & 会导致 IIS 为整个站点返回“HTTP 500.19”,而不仅仅是为日历路径返回。
保存文件。 IIS 会自动应用更改。
验证
通过订阅者使用的同一网络路径从组织外部的计算机运行以下命令。 将 URL 替换为你自己发布的日历地址。 该 -A 参数将请求显示为日历应用程序而不是浏览器,这是重现问题的原因。
curl.exe -s -o NUL -D - -A "iOS/26.6.1 (23G83) dataaccessd/1.0" "https://mail.contoso.com/owa/calendar/{id}/{token}/calendar.ics"
更改之前:
HTTP/1.1 302 Found
Content-Type: text/html; charset=utf-8
Location: /owa/calendar/auth/errorFE.aspx?httpCode=500
Set-Cookie: OwaLight=; expires=Mon, 24-Aug-2026 13:47:06 GMT; path=/
Content-Length: 161
请求将重定向到错误页,并且不返回日历数据。
更改后:
HTTP/1.1 200 OK
Content-Type: text/calendar; charset=utf-8
Content-Length: 1780
检查值和 HTTP/1.1 200 OKContent-Type: text/calendar。 只有在请求失败时才会出现标 Set-Cookie: OwaLight= 头。 因此,它的缺失证实了该规则的有效性。
若要查看日历内容,请从命令中删除 -o NUL -D - 。 工作响应以 BEGIN:VCALENDAR开头。
curl.exe -s -A "iOS/26.6.1 (23G83) dataaccessd/1.0" "https://mail.contoso.com/owa/calendar/{id}/{token}/calendar.ics"
要验证 IIS 本身是否看到规则,并确定哪个文件保存该规则,请在服务器上运行以下命令:
& "$env:windir\System32\inetsrv\appcmd.exe" list config "Exchange Back End" -section:system.webServer/rewrite/rules
Select-String -Path "$env:windir\System32\inetsrv\config\applicationHost.config" -Pattern 'OWA published calendar'
Select-String -Path "$env:ExchangeInstallPath\ClientAccess\web.config" -Pattern 'OWA published calendar' -ErrorAction SilentlyContinue
此外,请验证已发布的日历是否仍在浏览器中打开,并且正常 /owa/ 登录不受影响。
回退
要删除该解决方法,请删除 IIS 管理器中的规则,或从包含该规则的文件中删除 <rewrite> 该块。 此更改不需要重启。
请检查这两个位置,因为规则可以存储在任一位置:
C:\Windows\System32\inetsrv\config\applicationHost.config%ExchangeInstallPath%\ClientAccess\web.config
如果从一个文件中删除规则,而副本保留在另一个文件中,则重写将保持活动状态。
相关信息
在为已发布日历提供服务的每个服务器上应用该规则。 此规则是每个服务器的 IIS 设置,而不是组织范围的规则。 负载均衡器将订阅请求分发到数组的所有成员。 因此,错过的服务器将继续返回“HTTP 500”消息。 由此产生的间歇性故障比持续的间歇性故障更难诊断。 验证每个服务器上的规则。 不要以为它应用到任何地方。
在每个累积更新和安全更新后重新检查。 站点级 IIS 配置通常可在 Exchange 更新后继续使用,但不能保证此条件。 在 Exchange 更新过程中包括此规则的检查,以便该解决方法不会在将来的更新过程中消失。
这是临时解决方法。 Microsoft 已确认这是一个已知问题。 产品团队已注意到该行为,并正在评估未来更新中的潜在改进。 目前,尚无可用的解决方案的估计时间范围。 应在部署包含修补程序的内部版本后删除此规则。