node.js - 在不更改 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 路径?
解决方案
您的服务器不能导致浏览器对 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。
推荐阅读
- azure - 使用 Azure 数据工厂将来自 HTTP 端点的数据加载到 Azure Data Lake
- python - NLTK:使用 nltk 创建 ClassifierBasedTagger 时如何定义“labeled_featuresets”?
- javascript - 根据用户连接自动调整质量
- git - 在 gitlab 的分支中添加并提交所有更改的文件
- reactjs - React-Bootstrap Navbar 不显示样式
- r - Rcpp:S4.slot() 的成本
- typescript - 强制接口字段的名称必须等于另一个字段的值
- git - 无分支推送 git commit
- node.js - docker container install -g 复制到其他容器
- xcode - Xcode10 错误:“iPhone 已拒绝启动请求”