已发布的日历 (.ics) 返回日历应用程序的 HTTP 500

应用对象
Exchange Server SE Exchange Server 2019 Exchange Server 2016

安装 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 管理器

  1. 打开 IIS 管理器。 展开服务器,展开 网站,选择“ Exchange 后端”,然后双击“ URL 重写”。

    站点树

  2. 在右侧的“操作”窗格中,选择“添加规则” () ...,在“入站规则”下选择“空白规则”,然后选择“确定”。

    添加规则

  3. 输入名称并使用以下值完成 匹配 URL 部分。

    字段 值
    名称 OWA 发布的日历强制高级布局
    请求的 URL 与模式匹配
    使用 正则表达式
    模式 ^owa/calendar/.+\.ics$
    忽略大小写 时间

    Match-URL

  4. 展开 “条件”,单击“ 添加...” ,然后使用以下值完成对话框。 如果请求已带有布局参数,则此条件会让请求处于单独状态。

    字段 值
    条件输入 {QUERY_STRING}
    检查是否输入字符串 与模式不匹配
    模式 (^|&)layout=

    添加条件

    单击“ 确定”后,条件将显示在列表中, 逻辑分组 保留为 “全部匹配”。

    条件列表

  5. 展开 “操作” ,并使用以下值完成它。

    字段 值
    操作类型 重写
    重写 URL {R:0}?layout=premium&{QUERY_STRING}
    追加查询字符串 已清除
    停止处理后续规则 时间

    操作

    重要

    清除“ 追加查询字符串 ”复选框。 如果使复选框保持选中状态,IIS 将再次追加原始查询字符串。 这会导致请求具有重复的参数。

    在 “操作 ”窗格中,选择 “应用” 以保存规则。

  6. 验证规则是否列在 URL 重写 列表中。 展开它以查看条件。

    规则列表

不需要回收应用程序池。 IIS 将自动重新加载配置。

注意

根据服务器的功能委派设置,IIS 管理器将规则写入 applicationHost.config 或 Exchange 后端站点 (%ExchangeInstallPath%\ClientAccess\web.config) 的根 web.config 文件。 这两个位置均有效。 稍后验证或删除规则时,请记住这一点。

方法 B:编辑 applicationHost.config

如果您希望将配置部署为文件更改,例如通过配置管理工具,请使用此方法。

文件:C:\Windows\System32\inetsrv\config\applicationHost.config

  1. 备份该文件。

    Copy-Item C:\Windows\System32\inetsrv\config\applicationHost.config "C:\Windows\System32\inetsrv\config\applicationHost.config.bak-$(Get-Date -f yyyyMMdd-HHmmss)"
    
  2. 找到 <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="(^|&amp;)layout=" negate="true" />
              </conditions>
              <action type="Rewrite" url="{R:0}?layout=premium&amp;{QUERY_STRING}" appendQueryString="false" />
            </rule>
          </rules>
        </rewrite>
      </system.webServer>
    </location>
    

重要

保留 appendQueryString="false" 该属性。 属性默认为 true。 因此,如果省略它,IIS 将再次追加原始查询字符串。 这会导致请求具有重复的参数。

重要

必须像此文件中一样 &amp; 编写与号。 在 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 已确认这是一个已知问题。 产品团队已注意到该行为,并正在评估未来更新中的潜在改进。 目前,尚无可用的解决方案的估计时间范围。 应在部署包含修补程序的内部版本后删除此规则。