为什么匹配规则重写进入 URL with iisnode 模块

Why is matching rule rewriting going into the URL with iisnode module

我使用的是 windows 2016 和 IIS 10(版本在这里不是很相关,但只是说一下),我正在使用模块 iisnode 将 windows 身份验证获取到 Node.js。 一切正常,但我已经花了好几个小时思考配置,但我不确定如何进行一些改进。

目前的情况是我有脚本hello.js

var express = require('express');

var app = express.createServer(); // BTW why this deprecated syntax here? 
// maybe just because I've copied the folder from the old examples delivered in the setup!?

app.get('/toh-api/rest/foo', function (req, res) {
    res.send('Hello from foo! [express sample]');
});

app.get('/toh-api/rest/bar', function (req, res) {
    var username = req.headers['x-iisnode-auth_user'];
    const logonuser = req.headers["x-iisnode-logon_user"];
    var authenticationType = req.headers['x-iisnode-auth_type'];
    console.log('username',username);
    console.log('authenicationType',authenticationType)
    res.send('Hello ' + username + ':' + logonuser + ' from bar! [express sample] ' + authenticationType);
});


app.all('/toh-api/rest/hello.js', function (req, res) {
    res.send('Hello from hello.js! [express sample] ');
});

和一个web.config

<configuration>
  <system.webServer>


    <handlers>
      <add name="iisnode" path="hello.js" verb="*" modules="iisnode" />
    </handlers>

    <rewrite>
      <rules>
        <rule name="my rool for toh">
          <match url="rest/*" />
          <action type="Rewrite" url="/toh-api/hello.js" />
        </rule>
      </rules>
    </rewrite>


    <iisnode 
      loggingEnabled="true"
      logDirectory="F:\Logs\myapp\iisnode" 
      promoteServerVars="AUTH_USER,AUTH_TYPE,HTTP_UID,LOGON_USER" />
    
  </system.webServer>
</configuration>

当我从指向服务器 URL http://myserver.mydomain/toh-api/rest/bar 的客户端计算机打开浏览器时,系统询问我网络凭据(正确,确实我已经在 IIS 上设置了 win 身份验证网站),最后我看到了

Hello MYDOMAIN\MYUSERNAME:MYDOMAIN\MYUSERNAME from bar! [express sample] Negotiate

到目前为止,还不错。

IIS URL REWRITE 只是让我有点困惑。在这种情况下,我不得不将 "rest" 设为 match url,并且我需要将此 /rest/ 包含在我的 URL 的最后部分(我真的花了几个小时并在正确之前进行了许多试验和错误,就像现在一样)。理想情况下,我更喜欢得到一个没有那部分的 URL,所以我们说 http://myserver.mydomain/toh-api/bar(注意 toh-api 是 IIS 应用程序中的别名,所以它当然必须在那里) . node.js 服务器文件 (hello.js) 的更改微不足道。

URL REWRITE 部分的更新是什么? <match url="*" /> 似乎不正确且无法正常工作。但我想它应该是可行的(对吧?),据我所知,我想它或多或少是 IIS 子文件夹下 Angular dist 的 url 重写部分......

I imagine it is more or less the url rewriting part for an Angular dist under a subfolder of IIS, as far as i can understand...

是的,实际上我是从 tutorial of Angular under IIS subfolder.

中复制了这个想法

现在我有了(IIS别名/toh-api/部分可以从url跳过)

<rewrite>
  <rules>
    <rule name="my app rule" stopProcessing="true">
    <match url=".*" />
    <action type="Rewrite" url="hello.js" />
  </rule>
  </rules>
</rewrite>

只有星号 * 是 RegEx 中的模式错误(因此 500 Server Error),您确实需要点星号 .* - 表示任何序列,包括 0 次出现,任何字符 - 所以 url=".*" 需要 (以避免 500 Server Error)并且它 成功了!问题已解决(hello.js 有明显变化)。顺便说一句,stopProcessing="true" 似乎没有必要。

另一个更简单选项是patternSyntax="Wildcard"在带有规则名称的标签内。在那种情况下,星号就可以了。

## 动词 PUT 和 DELETE ##

但是,我注意到动词 PUT 和 DELETE 的一个模糊错误:它们不是 IIS URL 重写的,它们会导致 404 未找到错误(也许值得跟进的问题)。 (添加和删除动词,还有