【问题标题】:Can an iisnode-hosted web application work out the virtual path at which it is hosted?iisnode 托管的 Web 应用程序能否计算出托管它的虚拟路径?
【发布时间】:2023-03-14 13:27:02
【问题描述】:

我正在使用iisnode 在 Windows 上的 IIS 中托管节点 Web 应用程序。当我在 Web 服务器(比如 Express 或 Restify)上设置路由时,我希望以一种独立于 IIS 托管应用程序的路径的方式进行。

例如,我的应用程序可以托管在运行 IIS 的两台机器上的两条不同路径上;第一个可以在/foo 托管,第二个可以在/bar 托管。假设我的应用程序想要在/baz 设置路由 - 在第一台机器上我需要在/foo/baz 配置路由,而在第二台机器上我必须使用/bar/baz 这意味着复制一些配置IIS。

是否可以从 iisnode 托管的应用程序中可靠地计算出路径,以便我可以计算正确的设置路径?或者我可以使用另一种技术来避免这样做吗?

【问题讨论】:

    标签: node.js iis express iisnode


    【解决方案1】:

    我不知道有什么方法可以避免在 iisnode 中托管的 node.js 应用程序中看到对应于虚拟目录的路径段。确保您的应用程序代码与主机无关的最佳方法是将其托管在 IIS 网站的根目录中。

    【讨论】:

    • 在我的情况下这是不可能的:(
    • 太可惜了……不得不在所有路径(图像、样式表、路由、重定向……)中使用虚拟目录非常痛苦
    • 这是 iisnode 本身的限制吗?还是 iisnode 依赖项之一的限制?
    【解决方案2】:

    @GraemeF:这有点 hacky,但这就是我绕过这个限制的人。

    首先,我在名为 home 的应用中添加了一个全局变量:

    var express = require('express'),
        app = express.createServer(),
        home = process.env.deployPath || '';
    

    然后,我使用 home 变量设置路线:

    app.get(home + '/baz', function(req, res) {
        res.send('This is the /baz route');
        res.end();
    });
    

    然后,只需在您的应用程序 web.config 中设置 deployPath appSetting:

    机器 1:

    <appSettings>
        <add key="deployPath" value="/foo" />
    </appSettings>
    

    机器 2:

    <appSettings>
        <add key="deployPath" value="/bar" />
    </appSettings>
    

    您可以在每台机器上手动设置值,让构建过程设置值,甚至将设置添加到目标机器的全局 web.config。

    【讨论】:

    • @Tomasz,是否可以将进程环境变量设置为 HttpRuntime.AppDomainAppVirtualPath?通常,我只会提交一个拉取请求,但我根本不会 C++。
    • 这几乎就是我所做的,但它并没有真正弄清楚路径是什么,我们只是通过告诉它来作弊!我真的很想避免添加这个额外的配置步骤。 (另外,我不知道 Tomasz 是否会在那里看到你的建议!)
    • 我也在github中创建了一个issue。
    【解决方案3】:

    This answer 建议从web.config 文件中获取路径。

    另外,this link 也可能会有所帮助:

    结果证明解决方案得到了很好的解决,至少对于使用 app.use() 的“快速”框架应用程序而言

    当你调用 app.use(app.router) 时,你可以为你的虚拟目录传递一个命名空间前缀,然后请求就会成功,但是谁想要将他们的虚拟目录名称硬编码到他们的应用程序中 [哎呀!]?

    解决方案非常简单,因为 IISNODE 将 appSettings 提升为环境变量。利用这一事实,您可以在应用程序 web.config 中添加一个条目,例如:

    <appSettings>
            <add key="appvirtdir" value="/nodetest" />
    </appSettings>
    

    然后你可以像这样对你的 server.js 文件做一个简单的修改:

    app.configure(function () {
    ....
        app.use(process.env.appvirtdir || '', app.router);
    ....
    });
    

    【讨论】:

      【解决方案4】:

      express 和 restify 都允许使用正则表达式定义路径。通过使用正则表达式路径,您可以完全避免前缀问题。

      代替

      server.get({ path: '/virtual/directory/structure/status/',...
      

      使用

      server.get({ path: /.*\/status/,...
      

      而且不需要任何魔法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-07
        • 2015-03-10
        • 2011-04-01
        • 2011-02-04
        • 2017-02-05
        • 1970-01-01
        相关资源
        最近更新 更多