CODE:
app.get("/:url", function(req,res) {
var url = req.params.url;
res.send(url);
});
问题:
这不起作用。
如果我尝试:
http://localhost:3000/https://www.google.com
我明白了:
Cannot GET /https://www.google.com
答案 0 :(得分:2)
您可以使用正则表达式尝试此操作:
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,这是一个合法的网址:
http://localhost:3000/https://tools.ietf.org/html/rfc3986
但请注意,虽然这也是合法的:
http://localhost:3000/https://tools.ietf.org/html/rfc3986#section-3.3
如果您在浏览器中输入了该网址,则您的服务器只会获得:
/https://tools.ietf.org/html/rfc3986
在请求中。出于这个原因,虽然不是绝对必要,但我仍然建议对您在其他网址中放置的网址进行网址编码 - 请参阅 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视为注释,以防有人认为这可能是原因。即使使用引号也不会发送,并且可以使用-v
的{{1}}开关来演示会发生什么:
curl
正如您所看到的,甚至没有使用HTTP发送散列片段,因此您的服务器甚至无法知道它是否存在。
顺便提一下,这也表明在其他网址中使用未经编码的网址不会弄乱任何代理,因为对代理服务器的HTTP请求会发送此信息:
* 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: */*
而不是这个:
GET https://www.google.com/ HTTP/1.1
所以他们不能混淆。 (注意斜线。)
答案 1 :(得分:2)
这是因为:
和/
是构造网址时使用的特殊字符。换句话说,它们不是 url-safe 。如果要将这些字符作为URL路径的一部分发送,使用默认的Express param解析器,则必须percent-encode。
使用现有代码尝试此操作:
curl http://localhost:3000/https%3A%2F%2Fwww.google.com
你应该回来:
https://www.google.com
另一种选择是使用查询参数而不是路径变量。稍微修改您的代码段:
app.get("*", function(req, res) {
var url = req.query.url;
res.send(url);
});
然后,您可以使用以下命令对其进行测试:
curl http://localhost:3000?url=https://www.google.com
你应该回来:
https://www.google.com
虽然我会说对这些字符进行百分比编码仍然是一个好主意,即使Express可以这样解析它们。它可能会导致奇怪的行为。
另一种选择是将url作为字符串发送到POST
请求的正文中,但根据您的使用情况,这可能不是RESTful。