我在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
如何防止将无缓存添加到缓存控制头?
答案 0 :(得分:1)
尝试以下任何一种方法:
1)在IISNode中设置缓存:app.use(express.static(path.join(__dirname, 'public'), {maxAge: 86400000}));
2)添加新的IIS规则以缓存来自youriisnode.js的所有目标
或强>
3)
在iisnode中提供静态内容的最佳方法是配置URL重写模块,以便IIS静态文件处理程序处理静态内容而不是node.js的请求。让IIS提供静态内容比使用任何node.js机制提供这些文件具有很大的性能优势,因为内核级别优化了缓存,而且不必破解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请求,除外:
请求日志(/server.js.logs/0.txt,/server.js.logs/1.txt等),
调试请求(/server.js/debug),
对public子目录中存在的物理文件的请求(例如,对/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