你可以试试这个,使用正则表达式:
var app = require('express')();
app.get(/^\/(.*)/, function (req, res) {
var url = req.params[0];
res.send(url);
});
app.listen(3000, () => console.log('Listening on 3000'));
当你运行时:
curl http://localhost:3000/https://www.google.com
服务器应该返回:
https://www.google.com
更新
URL 中的冒号是否合法存在一些争议。
详情请看这个问题:
根据 RFC 3986,这是一个合法的 URL:
http://localhost:3000/https://tools.ietf.org/html/rfc3986
但请注意,虽然这也是合法的:
http://localhost:3000/https://tools.ietf.org/html/rfc3986#section-3.3
如果您在浏览器中输入该 URL,您的服务器将只获得:
/https://tools.ietf.org/html/rfc3986
在请求中。出于这个原因,虽然不是绝对必要的,但我仍然建议对您放入其他 URL 的 URL 进行 URL 编码 - 请参阅 Zac Delventhal 的答案。
实验
使用上面的代码示例,这个命令:
curl http://localhost:3000/https://www.google.com/
会输出这个:
https://www.google.com/
但是这个命令:
curl 'http://localhost:3000/https://www.google.com/#fragment'
会输出这个:
https://www.google.com/
请注意,我在上面使用单引号不是因为它们在这里是必需的 - 它们不是,请参阅:
echo http://localhost:3000/https://www.google.com/#fragment
但是为了表明哈希片段不会消失,因为它被 shell 视为注释,以防有人认为这可能是原因。即使使用引号也不会发送,并且可以使用curl 的-v 开关演示发生的情况:
* Connected to localhost (127.0.0.1) port 3000 (#0)
> GET /https://www.google.com/ HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:3000
> Accept: */*
正如您所见,哈希片段甚至没有通过 HTTP 发送,因此您的服务器甚至不可能知道它的存在。
顺便说一句,这也表明在其他 URL 中使用未编码的 URL 不会弄乱任何代理,因为对代理服务器的 HTTP 请求会发送以下内容:
GET https://www.google.com/ HTTP/1.1
不是这个:
GET /https://www.google.com/ HTTP/1.1
所以他们不会混淆。 (注意斜线。)