NodeJS服务器 - 多个URL重写配置

时间:2017-11-15 21:15:46

标签: node.js express url-rewriting alias

我希望使用NodeJS服务器作为临时解决方案,以测试在.NET环境(我在Mac上)中构建的一些AngularJS应用程序。两个应用程序都使用<base>标记,而web.config具有重写规则,以避免刷新404等。

我发现了一种可能的方法here,但是,我无法更新示例以包含多个规则。

dir结构我正在尝试测试看起来像这样:

|-- global (both apps use assets located inside of global)
|-- apps
    |-- myApp1
    |-- myApp2

应用程序本身使用 相对于所有资产的根 路径。所以,例如:

myApp1:

/global/images/image.jpg
/apps/myApp1/images/image.jpg
/apps/myApp1/css/styles.css
/apps/myApp1/js/scripts.js

web.config

中描述了以下规则
    <rule name="AngularJS Route for myApp1" stopProcessing="true">
        <match url="^myApp1/.*" />
        <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        </conditions>
        <action type="Rewrite" url="/apps/myApp1/default.aspx" />
    </rule>
    <rule name="AngularJS Route for myApp2" stopProcessing="true">
        <match url="^myApp2/.*" />
        <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        </conditions>
        <action type="Rewrite" url="/apps/myApp2/default.aspx" />
    </rule>

可以使用各自的 别名访问这两个应用:

mydomain.com/myApp1/
mydomain.com/myApp2/

所以,说到这一点,我正在尝试创建一个非常简单的nodejs服务器来模拟上面的内容,而不是寻找能够运行生产就绪服务器的东西。只要这个客户端发送给我测试的东西,我就可以随时启动。

我开始查看一些链接,例如above,但我很难通过以下代码了解如何使用多次重写:

server.js

const express = require('express');
const app = express();

app.use((req, res, next) => {
    if (req.url === 'myApp1') {

        //what do I do here?
        //tell it to reference the orig path?

        req.url = '/apps/myApp1/'; 

        //or do I use the router approach that's discussed in my reference link above?
    }

    next();
});

app.use(express.static(__dirname + '/'));

app.listen(3000, () => {
    console.log('Listening on port 3000')
});

似乎这个问题被问了很多,但是我还没有看到它应用于多次重写,同时还要记住这两个应用程序都来自的共享全局目录。以前任何人都不得不做这样的事情吗?

1 个答案:

答案 0 :(得分:0)

想想我弄清楚了。这是我对将来看待这个问题的人的解决方案。不确定这是否是最好的方法,但它似乎对我有用:

const express = require('express');
const path = require('path');
const router = express.Router();
const app = express();

const static = router.use('/', express.static(__dirname + '/', { redirect: false }));

const app1 = router.get('/myApp1*', (req, res, next) => {
    res.sendFile(path.resolve('apps/myApp1/index.html'));
});

const app2 = router.get('/myApp2*', (req, res, next) => {
    res.sendFile(path.resolve('apps/myApp2/index.html'));
});

app.use(static, app1, app2);

app.listen(3000, () => {
    console.log('Listening on port 3000');
});