我是sails.js和node.js的新手,所以这个问题可能很简单,但我找不到答案。我已将node.js应用程序部署到IIS中的网站,因此可以通过http://example.com/myapp/
访问该应用程序。浏览到http://myhost.com/myapp/app.js
时,我会收到http状态404 (Not found)
,因为sail.jss正在寻找http://myhost.com/images/logo.png
等网址,但此文件实际上位于http://myhost.com/myapp/.tmp/public/images/logo.png
。这个.tmp
文件夹似乎是由框架动态创建的。
有人可以对此有所了解吗?
[编辑]
我在web.config中添加了重写规则,它运行得更好。但它只有在我将应用程序放在我的网站的根目录(访问http://myhost.com/)时才有效。如果我将应用程序放在较低级别(通过http://myhost.com/myApp访问),则添加的规则似乎不会产生任何影响。
这是web.config:
<handlers>
<add name="iisnode" path="app.js" verb="*" modules="iisnode" />
</handlers>
<rewrite>
<rules>
<rule name="StaticContent">
<action type="Rewrite" url="assets{REQUEST_URI}"/>
</rule>
<rule name="DynamicContent">
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
</conditions>
<action type="Rewrite" url="app.js"/>
</rule>
</rules>
</rewrite>
答案 0 :(得分:1)
关键是允许Express处理所有路由。最好的方法是通过iisnode(来自:https://nodestream.wordpress.com/2015/11/24/sails-js-configuration-for-iis/)将所有流量路由到app.js:
<configuration>
<system.webServer>
<!-- Tell IIS to use the iisnode module to run your
application -->
<handlers>
<add name="iisnode" path="app.js" verb="*" modules="iisnode" />
</handlers>
<!-- Add iisnode with the @nodeProcessCommand line if
you see the error: Make sure the node.exe executable
is available at the location specified in the
system.webServer/iisnode/@nodeProcessCommandLine element
of web.config. -->
<iisnode
nodeProcessCommandLine="%ProgramFiles%\nodejs\node.exe"
/>
<!-- Since behind the covers, Sails.js is just an express app
rewrite all urls to processed by iisnode via app.js. This
will sort out things like the routing to your public
resources (images, js, styles) and all configured rest
endpoints. -->
<rewrite>
<rules>
<rule name="root">
<match url=".*" />
<action type="Rewrite" url="app.js" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
答案 1 :(得分:0)
.tmp文件夹是由Grunt创建的。您可以引用gruntfile和任务文件夹。 pipeline.js允许您选择文件/文件夹以便注入和吐出grunt。您可以轻松地将其更改为指向/ images和/ js文件夹。
tasks/pipline.js
module.exports.cssFilesToInject = cssFilesToInject.map(function(path) {
return '.tmp/public/' + path; // Change this
});
module.exports.jsFilesToInject = jsFilesToInject.map(function(path) {
return '.tmp/public/' + path; // Change this
});
我能想到的另一个解决方案是,但我不确定IIS是否拥有它,是要做一个重写规则。当用户访问site.com/images时,请将其指向.tmp / public / images。在Apache服务器中常见。