我在IIS中的以下设置:
- 默认Web站点(www.foo.com)托管标准的HTML网站
- 默认Web站点(www.foo.com/bar)运行IIS节点下的Web应用程序
- 节点项目是利用快递
我不能为我的生活让这件事正确配置,所以当我打的web应用程序是正确地担任了该节点的应用程序。 我想我的问题就出在web.config中。 任何人都可以帮我写一个正确的web.config得到这个正常工作? 目前的版本我的配置将我的服务器节点的响应,指出它不能得到任何在我的网址输入资源。
下面是我的配置的最新版本:
<configuration>
<system.webServer>
<handlers>
<add name="iisnode" path="app.js" verb="*" modules="iisnode" />
</handlers>
<rewrite>
<rules>
<rule name="bar">
<match url="bar/*" />
<action type="Rewrite" url="app.js" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
我碰到了同样的问题而回,跑我的应用程序中的虚拟目录。
经过大量的浪费时间和努力,我能够把所有的碎片拼凑起来,让我的应用程序在虚拟目录下工作,这包括使用Socket.io应用
由于没有太多的文档,在那里为这个特殊的场景,可用,我发现,只有部分描述了如何解决这个问题的资源。 这里是如何得到这一切工作的指南。 我个人有多个Node.js的Web服务实现无论是REST API或使用该设置Socket.io。
我强烈建议使用下面的Web.config文件模板,得到这个工作。
IISNode Web.config文件模板
https://gist.github.com/pbaio/f63918181d8d7f8ee1d2
在上面的链接配置有一些意见,我把那里帮助易用性。 其配置为使用app.js作为主要文件,但如果你的文件被命名为不同的东西简单地切换值使用该文件来代替。
为了得到这个配置工作,你将需要为IIS URL重写模块 ,如果你不已经安装了它。
默认设置
默认情况下,这个模板是建立在IIS一个标准的Web应用程序运行,而不是在虚拟目录的环境中工作。 然而,有一些小的调整,你可以使用同样的web.config中的虚拟目录中运行的Node.js应用。
获取Express使用虚拟目录
IISNode让你声明的所有键<appSettings>
环境变量。 我们可以用它来我们的优势,我们设置虚拟目录的路径,将其暴露在我们的主文件。 在上面我们的主文件的模板是app.js
。
获取我们的虚拟目录路径
我们需要让我们的应用程序将在我们的Web.config文件中路由路径。 我们通过访问我们的过程目标对我们的环境变量做到这一点。 以下行添加到我们的app.js
文件。
var virtualDirPath = process.env.virtualDirPath || '';
这从我们的Web.config检索我们的virtualDirPath并给它空字符串的默认值。
路由页面
然后我们就可以在前面加上virtualDirPath我们的路线,如果你正在使用如翡翠或EJS视图引擎,我们可以传递给视图的超链接和我们的虚拟目录路径,例如:
var app = require('express')();
app.get(virtualDirPath + '/', function(req, res) {
res.render('index', { virtualDirPath: virtualDirPath });
});
静态内容
我们可以如下轻松满足这件事:
app.use(express.static(path.join(virtualDirPath, 'public')));
如果你正在使用Bower.io同样的事情:
app.use('/bower_components', express.static(path.join(virtualDirPath,'bower_components')));
使用具有快速和Socket.io虚拟目录
当使用虚拟目录与Socket.io我们需要做出改变,为服务器和客户端的配置。
服务器端
我们需要来配置我们的Socket.io服务器比你通常会略有不同。
var app = require('express')();
var virtualDirPath = process.env.virtualDirPath || '';
var server = require('http').Server(app);
var io = require('socket.io')(server, { path: virtualDirPath + '/socket.io' });
// Get the port that we should be listening on
server.listen(process.env.PORT || 8080);
在上面的代码中,我们正在修改我们的Socket.io服务器在我们的virtualDirpath操作,而不是默认的路径( '/socket.io'
是默认的路径)。
Web.config changes
为了IISNode正常使用socket.io工作,我们还需要添加一些额外的URL重写和换出我们的处理程序。 在从上面我们可以看到线57 Socket.io处理器模板配置文件,它是在模板中注释掉。
<add name="iisnode-socket.io" path="app.js" verb="*" modules="iisnode" />
然后,我们需要增加我们的网址重写为Socket.io路径
<rule name="SocketIO" patternSyntax="ECMAScript">
<match url="socket.io.+" />
<action type="Rewrite" url="app.js"/>
</rule>
客户端
在客户端,我们只需要指定该Socket.io服务器以代替其默认路径监听的路径。
var socket = io.connect('http://example.com:port', { path: '/virtualDirPath/socket.io' });
一切都应该是好去在这一点上,在与IISNode一个虚拟目录运行你的应用程序Socket.io。
环境信息
使用此配置的应用程序使用的是Node.js,快速4.12.3的建造和安装IISNode在IIS 7.5上运行。 此外,通过改变conifg文件处理程序,Socket.io可以在一个虚拟目录使用。 在上面的例子中使用的Socket.io版本是1.3.5
我碰到了同样的问题 。
归根结底,工作是我的应用程序固定请求的URL。 我们从使用快递到哈啤切换,所以我已经转换该代码高致病性禽流感回到表达而不先进行测试,但它应该让你在球场。
app.use(function (req, res, next) {
if(!settings.serverPath) return next();
console.log(req.url);
var regex = new RegExp('(' + settings.serverPath + ')(/.+)', "i");
req.url = req.url.replace(regex, "$2");
console.log(req.url);
return reply.continue();
});
//set up your routes here...
对于那些谁不能够为静态文件一定做NG构建之前你的基地href网址更改为虚拟目录路径,然后从服务器为你的静态files.Hope这可以帮助别人。
文章来源: IIS, Node.js, and Web Application with IISNode not configured right with Virtual Directory