【问题标题】:Client-side caching with IISNode使用 IISNode 进行客户端缓存
【发布时间】:2014-08-02 04:36:43
【问题描述】:

我在 IIS 8.5 上运行 IISNode,但无法启用静态文件的客户端缓存。 使用 IISNode 无需接触节点即可提供文件。当文件通过 IISNode 提供时,它们包含 Cache-Control: no-cache 标头。

如果我只托管节点并绕过 IIS 和 IISNode,我会得到 Cache-Control:public, max-age=604800 作为标头。

IIS 或 IISNode 在某处设置缓存控制值。我似乎无法在 IIS 中更改它,因为当我得到 Cache-Control:no-cache,public,max-age=604800

如何防止 no-cache 添加到缓存控制标头?

【问题讨论】:

    标签: caching iis client-side iisnode iis-8.5


    【解决方案1】:

    如果其中任何一个有效,请尝试:

    1)在IISNode中设置缓存:app.use(express.static(path.join(__dirname, 'public'), {maxAge: 86400000}));

    2) 添加新的 IIS 规则以缓存来自 youriisnode.js 的所有响应

    3)

    在 iisnode 中提供静态内容的最佳方式是配置 URL 重写模块,以便 IIS 静态文件处理程序处理对静态内容的请求,而不是 node.js。与使用任何 node.js 机制为这些文件提供服务相比,让 IIS 服务静态内容具有很大的性能优势,因为围绕缓存进行了内核级优化,并且不必中断 JavaScript 代码。

    创建 web.config:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <system.webServer>         
          <handlers>
               <add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
         </handlers>
          <rewrite>
               <rules>
    
                    <rule name="LogFile" patternSyntax="ECMAScript" stopProcessing="true">
                         <match url="^[a-zA-Z0-9_\-]+\.js\.logs\/\d+\.txt$"/>
                    </rule>
    
                    <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">                    
                        <match url="^server.js\/debug[\/]?" />
                    </rule>
    
                    <rule name="StaticContent">
                         <action type="Rewrite" url="public{REQUEST_URI}"/>
                    </rule>
    
                    <rule name="DynamicContent">
                         <conditions>
                              <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
                         </conditions>
                         <action type="Rewrite" url="server.js"/>
                    </rule>
    
               </rules>
          </rewrite>
       </system.webServer>
     </configuration>
    

    它的作用如下:

    • 假设 server.js 是 node.js 应用程序的入口点,它将接收所有 URL 路径的 HTTP 请求除了

      1. 日志请求(/server.js.logs/0.txt、/server.js.logs/1.txt 等),

      2. 调试请求(/server.js/debug),

      3. 对存在于公共子目录中的物理文件的请求(例如,对 /styles.css 的请求将由 IIS 中的静态文件处理程序处理,而不是您的 node.js 应用程序 IFF 该文件存在于 \public\ styles.css 位置)。

    对所有其他 URL 的请求(例如 /a/b/c?foo=12)现在将被发送到 server.js 应用程序,并将按照那里实现的逻辑进行处理。如果是 Express 应用,将适用快速路线。

    原文来源:https://github.com/tjanczuk/iisnode/issues/160#issuecomment-5606547

    【讨论】:

    • 目前在做 2 和 3。不能做 1,因为 IISNode 处理静态内容的请求,Node 本身永远看不到请求。通过 web.config 执行 2。并且前面提到的 3 已经到位,因此节点不处理静态文件请求。 2 将public,max-age=604800 添加到缓存控制标头,但不会从中删除no-cache
    猜你喜欢
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2017-03-18
    相关资源
    最近更新 更多