node.js - 如何在 iisnode 中托管服务和静态内容

标签 node.js express iis url-rewrite-module iisnode

我的网站在 express 中运行。但现在我需要在 IIS 上托管它。如何让我的路由与 IISNode 一起工作?

我能够将我的静态内容移动到/public 文件夹(html、前端 js 等)。我不想这样做,但让那部分工作了。

我将服务器端逻辑移至/server。

我以前使用 .Net Web API 样式的路由,我的服务托管在/api。我把它们移到了/server/api。

每当我尝试请求我的 API 时,我都会收到 404。我怎样才能让它与 IISNode 一起工作?

app.use("/api", require("./api"));

// routes/api/index.js
var router = require('express').Router();
router.use('/questionsets', require('./questionsets'));
module.exports = router;   

var router = require('express').Router();
router.use('/questionsets', require('./questionsets.js'));
module.exports = router;

// routes/api/questions.js
var router = require('express').Router();

router.get('/', function (req, res) {
    ...
});

router.get('/:id', function (req, res) {
    ...
});

module.exports = router;        


<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <hiddenSegments>
          <remove segment="bin" />
        </hiddenSegments>
      </requestFiltering>
    </security>
    <handlers>
      <add name="iisnode" path="bin/www" verb="*" modules="iisnode" />
    </handlers>
    <iisnode loggingEnabled="false" />
    <httpErrors errorMode="Detailed" existingResponse="Replace">
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" prefixLanguageFilePath="" path="/" responseMode="ExecuteURL" />
    </httpErrors>
    <rewrite>
      <rules>
        <rule name="LogFile" patternSyntax="ECMAScript" stopProcessing="true">
          <match url="iisnode" />
        </rule>
        <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
          <match url="^bin\/www\/debug[\/]?" />
        </rule>
        <rule name="StaticContent" patternSyntax="ECMAScript" stopProcessing="true">
          <match url=".*" />
          <action type="Rewrite" url="{C:1}" logRewrittenUrl="true" />
          <conditions>
            <add input="{REQUEST_URI}" pattern=".*?\/(.*)" />
          </conditions>
        </rule>
        <rule name="DynamicContent" patternSyntax="ECMAScript">
          <match url=".*" />
          <conditions>
            <add input="{{REQUEST_FILENAME}}" matchType="IsFile" negate="True" />
          </conditions>
          <action type="Rewrite" url="server/app.js" logRewrittenUrl="true" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Source for url rewriting configuration

最佳答案

您需要安装应用程序请求路由 here和文档 here .

简单地将服务器端文件放在/server 下是行不通的。 启动您的快速服务器,假设正在收听 http://localhost:3200/ , 将请求“/”路由到“localhost:3200”只会将每个请求路由到您的快速服务器。

关于node.js - 如何在 iisnode 中托管服务和静态内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40351002/

相关文章:

.net - 在Docker容器中为iis启用详细日志记录

javascript - 如果目标文件不存在,则在 Node.js 中异步重命名文件

javascript - 从今天起获得先前值(value)的最佳方式

javascript - Node.js 和永远的 "exited with code: 0"

iis - IIS7.5 64bit 一次可以处理每个逻辑 CPU 多少个线程?

.net - 从支付网关回发时丢失 session

php - 带 Nodejs 的 Apache 上的 SSL

node.js - 我如何接收(而不是发送)来自 nodejs 的推送通知?

node.js - Express.js 路由带有可选参数?

javascript - ExpressJS 和 Mongoose 使用 for 函数多次创建