IIS和HapiJS错误:尝试提供静态文件时出现404错误

时间:2018-11-08 18:29:44

标签: node.js windows iis server hapijs

因此,我在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。

IIS 404 error

这是我的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="&quot;C:\Program Files (x86)\nodejs\node.exe&quot;" />

    </system.webServer>

    <system.web>
        <httpRuntime enableVersionHeader="false" />
    </system.web>
</configuration>

我尝试添加

<rule name="StaticContent">
    <action type="Rewrite" url="server.js"/>
</rule>

阻止,但不会改变任何内容。

如果您还没有收到,我不是Windows服务器用户,因此我正在尝试通过Google搜索解决该问题,但到目前为止还算不上运气。

我想我的问题是:

为什么IIS会尝试搜索文件,即使它应该重写所有路径才能进入我的NodeJS服务器?

它怎么知道我的哪些路线好,哪些不好?

如何使其不搜索该文件?

1 个答案:

答案 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="&quot;C:\Program Files (x86)\nodejs\node.exe&quot;" />

    </system.webServer>

    <system.web>
        <httpRuntime enableVersionHeader="false" />
    </system.web>
</configuration>