IIS ARR 反向代理磁盘缓存
IIS ARR Reverse Proxy Disk Cache
我想为转发请求的反向代理响应设置磁盘缓存。我希望所有对 http://localhost:88/ to be forwarded to https://whosebug.com/ 的请求(例如)都具有以下重写规则:
<rule name="ReverseProxy1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="https://whosebug.com/{R:1}" />
</rule>
效果很好。
而且我希望来自 https://whosebug.com/ 的所有响应都缓存在磁盘上。我在 applicationHost.config 中有以下设置:
<diskCache scavengerInterval="00:05:00">
<driveLocation path="C:\inetpub\temp\cache" maxUsage="0" />
<compression enabled="true">
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/x-javascript" enabled="true" />
<add mimeType="application/javascript" enabled="true" />
</compression>
<sharedDriveLocation path="" />
</diskCache>
<proxy enabled="true" httpVersion="PassThrough" reverseRewriteHostInResponseHeaders="true">
<cache requestConsolidationEnabled="true" queryStringHandling="Accept" validationInterval="00:01:00" />
</proxy>
<rewrite>
<globalRules>
<rule name="ARR_CacheControl_b17f5877-33f6-4bed-be49-f3c07a38cfef" enabled="true" patternSyntax="Wildcard">
<match url="*" />
<serverVariables>
<set name="ARR_CACHE_CONTROL_OVERRIDE" value="1,max-age=1800" />
</serverVariables>
<conditions>
<add input="{HTTP_HOST}" pattern="whosebug.com" />
</conditions>
</rule>
</globalRules>
</rewrite>
不幸的是,磁盘缓存从未被命中。我可以通过检查带有 X-ARR-CACHE-HIT=0 条目的 IIS 日志来判断。并且缓存文件夹始终为空。该文件夹是由 IIS 管理器 UI 创建的,我向该文件夹提供了对应用程序池标识的访问权限,因此我认为问题不在于对缓存文件夹的访问权限。
我错过了什么吗?在互联网上寻找解决方案没有给我任何结果,因此非常感谢任何输入。
我发现问题在于 SO 响应中存在 Vary 响应 header。并且根据 IIS forums 上的回复,ARR 不支持在响应中有 Vary header 时缓存。
我想为转发请求的反向代理响应设置磁盘缓存。我希望所有对 http://localhost:88/ to be forwarded to https://whosebug.com/ 的请求(例如)都具有以下重写规则:
<rule name="ReverseProxy1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="https://whosebug.com/{R:1}" />
</rule>
效果很好。
而且我希望来自 https://whosebug.com/ 的所有响应都缓存在磁盘上。我在 applicationHost.config 中有以下设置:
<diskCache scavengerInterval="00:05:00">
<driveLocation path="C:\inetpub\temp\cache" maxUsage="0" />
<compression enabled="true">
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/x-javascript" enabled="true" />
<add mimeType="application/javascript" enabled="true" />
</compression>
<sharedDriveLocation path="" />
</diskCache>
<proxy enabled="true" httpVersion="PassThrough" reverseRewriteHostInResponseHeaders="true">
<cache requestConsolidationEnabled="true" queryStringHandling="Accept" validationInterval="00:01:00" />
</proxy>
<rewrite>
<globalRules>
<rule name="ARR_CacheControl_b17f5877-33f6-4bed-be49-f3c07a38cfef" enabled="true" patternSyntax="Wildcard">
<match url="*" />
<serverVariables>
<set name="ARR_CACHE_CONTROL_OVERRIDE" value="1,max-age=1800" />
</serverVariables>
<conditions>
<add input="{HTTP_HOST}" pattern="whosebug.com" />
</conditions>
</rule>
</globalRules>
</rewrite>
不幸的是,磁盘缓存从未被命中。我可以通过检查带有 X-ARR-CACHE-HIT=0 条目的 IIS 日志来判断。并且缓存文件夹始终为空。该文件夹是由 IIS 管理器 UI 创建的,我向该文件夹提供了对应用程序池标识的访问权限,因此我认为问题不在于对缓存文件夹的访问权限。
我错过了什么吗?在互联网上寻找解决方案没有给我任何结果,因此非常感谢任何输入。
我发现问题在于 SO 响应中存在 Vary 响应 header。并且根据 IIS forums 上的回复,ARR 不支持在响应中有 Vary header 时缓存。