使用URL Rewrite从iisnode提供静态文件

时间:2012-05-08 20:23:00

标签: node.js iis-7 iisnode

我在web.config文件中使用了一个重写规则,用于在issnode下运行的节点应用程序指向我的server.js文件。 myapp / *指向server.js。

    <rule name="myapp" enabled="true">
      <match url="myapp/*" />
      <action type="Rewrite" url="server.js" />
    </rule>

这一直很好www.mywebsite.com/myapp/会加载运行我的应用程序。我想要的是从网站的根目录进行重定向,以便www.mywebsite.com/运行我的应用程序。所以我改变了我的web.config文件

    <rule name="myapp" enabled="true">
      <match url="/*" />
      <action type="Rewrite" url="server.js" />
    </rule>

所以这是运行server.js并提供我的静态html文件,唯一的问题是引用我的html文件中的任何外部文件(css,js,images等)每个请求只需500秒。我用它来提供静态文件

        var libpath = require('path');
        var _path = "."; <-- This seems to be the problem


        var uri = url.parse(req.url).pathname;
    var filename = libpath.join(_path, uri);
    fs.readFile(filename, "binary", function (err, file) {
            if (err) {
            res.writeHead(500, {
                "Content-Type": "text/plain"
            });
                 res.write(err + "\n");
                 res.end();
                return;
            }

         var type = mime.lookup(filename);
            res.writeHead(200, {
                "Content-Type": type
            });
         res.write(file, "binary");
         res.end();
        });

    break;

所以我的问题是如何指向我的节点app / server的root来提供静态文件。

由于

城野

2 个答案:

答案 0 :(得分:5)

在iisnode中提供静态内容的最佳方法是配置URL重写模块,以便IIS静态文件处理程序处理静态内容而不是node.js的请求。让IIS提供静态内容比使用任何node.js机制提供这些文件具有很大的性能优势,因为内核级别优化了缓存,而且不必破解JavaScript代码。

对于实现此目的的样板文件web.config配置,请参阅https://github.com/tjanczuk/iisnode/issues/160#issuecomment-5606547

答案 1 :(得分:3)

我使用建议的规则配置时遇到了一些问题,所以我做了一些更改:

<system.webServer>
  <handlers>
    <clear />
    <add name="iisnode" path="/index.js" verb="*" modules="iisnode" />
    <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
  </handlers>
  <rewrite>
    <rules>
      <rule name="static">
        <action type="Rewrite" url="www{REQUEST_URI}" />
      </rule>
      <rule name="serve-static" stopProcessing="true">
        <conditions logicalGrouping="MatchAny">
          <add input="{REQUEST_FILENAME}" matchType="IsFile" />
          <add input="{REQUEST_URI}" pattern="^/www/$" />
        </conditions>
      </rule>
      <rule name="node">
        <action type="Rewrite" url="index.js" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>
  • 第一个规则使用我的客户端目录{/ 1}}为所有请求添加前缀。
  • 如果文件存在或请求根路径,则第二个规则将停止处理
  • 第三条规则将其他任何内容重写为我的后端Node脚本的名称,以便iisnode处理程序可以选择它。

请注意,iisnode处理程序路径设置为www,这似乎消除了与同名客户端文件的冲突。

相关问题