Итак, я размещаю приложение 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.
Итак, вот мой 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 ???
Откуда он знает, какие из моих маршрутов хороши, а какие нет?
Как заставить его не искать этот файл?