コード:
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
正規表現を使用して、これを試すことができます。
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
しかし、ハッシュ フラグメントが消えないことを示すために、それが原因である可能性があると誰かが考えた場合に備えて、ハッシュ フラグメントはシェルによってコメントとして扱われるためです。引用符が使用されている場合でも送信されず、次の-v
スイッチで何が起こるかを示すことができますcurl
。
* 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 でさえ送信されないため、サーバーはそれが存在したことさえ知ることができません。
ちなみに、これは、プロキシ サーバーへの HTTP リクエストがこれを送信するため、他の URL 内でエンコードされていない URL を使用してもプロキシを台無しにしないことも示しています。
GET https://www.google.com/ HTTP/1.1
これではありません:
GET /https://www.google.com/ HTTP/1.1
混乱することはありません。(スラッシュに注意してください。)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加