首页 > 解决方案 > 在不更改 URL 的情况下快速重定向

问题描述

我有 2 台服务器,假设服务器 A 和服务器 B 和服务器 A 是负责处理请求并在需要时将它们重定向到服务器 B 的服务器。
所以,我的问题是,我可以在 nodeJS 中重定向而不更改 URL 吗?我有这个示例代码在 127.0.0.1 上运行,另一个 Apache 服务器在 192.168.1.112 上运行。

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

const mRouter = express.Router();
mRouter.get('/', (req, res, next) => {
    res.sendFile(path.resolve('index.html'));
});

mRouter.get('/B', (req, res, next) => {
    res.redirect('http://192.168.1.112');
});

app.use('/', mRouter);

app.listen(80);

和 index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Index page</title>
</head>
<body>
    <h1>Hello world</h1>
    <a href="/B">B Server</a>
</body>
</html>

当我单击链接时,它会重定向到正确的位置,但也会将 URL 更改为“ http://192.168.1.112 ”,我可以阻止它更改 URL 吗?

编辑:
例如,我在本地主机上运行服务器 A,并且从 192.168.1.112(服务器 B)请求到 127.0.0.1/B 的每个请求。问题是服务器 B 重定向到 index.php/*,如果我使用反向代理,则路径被放在 URL 中。有没有办法从服务器 B 中删除 URL 路径?

标签: node.jsexpressredirect

解决方案


您的服务器不能导致浏览器对 URL 撒谎(来自服务器端)。所以重定向总是会显示实际的 URL。

但是,您可以从 serverB 获得 serverA 代理(而不是重定向),因此来自 serverB 的数据实际上来自 serverA,然后 serverA 将显示在 URL 中,因为(就浏览器而言)该数据来自 serverA网址。代理时,浏览器会向 serverA 发送请求,然后在处理请求者的过程中 serverA 会意识到它需要来自 serverB 的一些数据,它会从 serverB 获取数据本身,然后将其作为对原始的响应返回对服务器 A 的请求。浏览器只会将其视为来自 serverA 的请求(即使数据实际上来自 serverB)。

要从 serverB 获取数据,serverA 可以使用诸如request. 您使用此 http 调用从其他服务器获取数据,然后将其作为您收到的请求的结果返回。

const request = require('request');

mRouter.get('/B', (req, res, next) => {
    // get actual data from other server and return it as our response
    request('http://192.168.1.112/B').pipe(res);
});

作为另一种选择,从客户端,如果您通过 Ajax 调用从浏览器页面获取数据,您还可以看到重定向,从 serverB 获取数据并将其插入到 serverA 页面。使用浏览器 Javascript 动态修改页面内容不会更改 URL。


推荐阅读