因此,我在Windows服务器上托管了hapijs应用程序。
一切正常,直到需要从hapijs应用程序中提供一些静态文件(前端)为止。
我添加了一条简单的路线:
// Index
server.route({
method: 'GET',
path: '/dist',
options: {
cors: {
origin: ['*'],
},
},
handler(request, h) {
server.log('info', `GET - ${request.url.path}`);
return h.file(__dirname + '/dist/index.html')
},
});
这行得通。
但是对于资产(位于同一文件夹中),无事可做,我无法使其正常工作。我尝试了以下操作:
server.route({
method: 'GET',
path: '/assets/{filename}',
options: {
cors: {
origin: ['*'],
},
},
handler(request, h) {
server.log('info', `GET - ${request.url.path}`);
return h.file(`${__dirname}/dist/assets/${request.params.filename}`)
},
});
和
server.route({
method: 'GET',
path: '/assets/{filename}.js',
options: {
cors: {
origin: ['*'],
},
},
handler(request, h) {
server.log('info', `GET - ${request.url.path}`);
return h.file(`${__dirname}/dist/assets/${request.params.filename}.js`)
},
});
以及它的其他一些风味。直到我意识到实际上是IIS而不是返回404的hapijs。
这是我的web.config
文件:
<configuration>
<system.webServer>
<handlers>
<remove name="OPTIONSVerbHandler" />
<add name="iisnode" path="server.js" verb="GET,POST,OPTIONS" modules="iisnode" />
<add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="iisnode" />
</handlers>
<rewrite>
<rules>
<rule name="DynamicContent">
<match url=".*" />
<action type="Rewrite" url="server.js" />
</rule>
</rules>
<outboundRules>
<rule name="Set-Access-Control-Allow-Origin for known origins">
<match serverVariable="RESPONSE_Access-Control-Allow-Origin" pattern=".+" negate="true" />
<action type="Rewrite" value="*" />
</rule>
</outboundRules>
</rewrite>
<httpErrors existingResponse="PassThrough" />
<security>
<requestFiltering>
<hiddenSegments>
<add segment="node_modules" />
</hiddenSegments>
</requestFiltering>
</security>
<iisnode nodeProcessCommandLine=""C:\Program Files (x86)\nodejs\node.exe"" />
</system.webServer>
<system.web>
<httpRuntime enableVersionHeader="false" />
</system.web>
</configuration>
我尝试添加
<rule name="StaticContent">
<action type="Rewrite" url="server.js"/>
</rule>
阻止,但不会改变任何内容。
如果您还没有收到,我不是Windows服务器用户,因此我正在尝试通过Google搜索解决该问题,但到目前为止还算不上运气。
我想我的问题是:
为什么IIS会尝试搜索文件,即使它应该重写所有路径才能进入我的NodeJS服务器?
它怎么知道我的哪些路线好,哪些不好?
如何使其不搜索该文件?
答案 0 :(得分:0)
最后,我设法通过以下配置解决了这个问题:
<configuration>
<system.webServer>
<handlers>
<add name="iisnode" path="server.js" verb="GET,POST,OPTIONS" modules="iisnode" />
</handlers>
<rewrite>
<rules>
<rule name="LogFile" patternSyntax="ECMAScript" stopProcessing="true">
<match url="iisnode"/>
</rule>
<rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
<match url="^server.js\/debug[\/]?" />
</rule>
<rule name="DynamicContent" stopProcessing="true">
<match url="^v1.*" />
<action type="Rewrite" url="server.js"/>
</rule>
<rule name="StaticContent">
<action type="Rewrite" url="public{REQUEST_URI}"/>
</rule>
</rules>
<outboundRules>
<rule name="Set-Access-Control-Allow-Origin for known origins">
<match serverVariable="RESPONSE_Access-Control-Allow-Origin" pattern=".+" negate="true" />
<action type="Rewrite" value="*" />
</rule>
</outboundRules>
</rewrite>
<security>
<requestFiltering>
<hiddenSegments>
<add segment="node_modules" />
</hiddenSegments>
</requestFiltering>
</security>
<iisnode nodeProcessCommandLine=""C:\Program Files (x86)\nodejs\node.exe"" />
</system.webServer>
<system.web>
<httpRuntime enableVersionHeader="false" />
</system.web>
</configuration>