Ошибка IIS & HapiJS: 404 при попытке обслужить статические файлы - PullRequest
0 голосов
/ 08 ноября 2018

Итак, я размещаю приложение hapijs на сервере Windows.

Все работало нормально, пока мне не понадобилось обслуживать некоторые статические файлы (мой интерфейс) из моего приложения 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, а не hapijs, возвращает 404.

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 голосов
/ 17 ноября 2018

В итоге мне удалось решить проблему со следующей конфигурацией:

<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>
...