为什么匹配规则重写进入 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 未找到错误(也许值得跟进的问题)。
(添加和删除动词,还有 )
我使用的是 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 的一个模糊错误:它们不是 IIS URL 重写的,它们会导致 404 未找到错误(也许值得跟进的问题)。
(添加和删除动词,还有