[解決済み] Express.js の req.ip が ::ffff:127.0.0.1 を返している。
質問
私は現在、要求されたユーザーのIPを取得しようとしています。問題は、IPが
::ffff:127.0.0.1
ではなく
127.0.0.1
. 試しに
trusted proxy
オプション (プロキシは使っていませんが) と
req.ips
は空白です。4.x Express.jsを使用しています。
router.get('/', function(req, res, next) {
console.log('ip', req.ip)
res.send({})
});
どのように解決するのですか?
::ffff:
は、IPv6(128ビット)空間内に配置されるIPv4(32ビット)アドレス用のサブネットプレフィックスです。 IPv6 は、サブネット プレフィックスとインターフェイス サフィックスの 2 つの部分に分かれています。 それぞれは64ビット長、つまり4つの16進数文字のグループです。
IPv6 では、先頭のゼロを削除し、さらに連続したゼロを削除することができます。
::ffff:
は実際には次のように変換されます。
0000:0000:ffff:0000
このアドレスはIPv4からIPv6へのサブネットプレフィックスとして指定されているため、どのIPv6プロセッサもIPv4アドレスで動作していると理解し、それに応じて処理します。
近い将来、IP アドレスはすべて IPv6 になるでしょう。これは、IPv4 アドレス空間の数 (42 億から雑多な目的のためのスペースを引いた数) がほぼなくなったからです。
<ブロッククオートIPv6では、より大きなスペースを確保することができます。 ビル・ゲイツが IPv6 について講演しています。
IPv6の名前空間を使用してIPアドレスのアドレッシングを開始することが重要であり、そのため、IPv6の名前空間内に
::ffff:
を含めることが重要です。なぜなら、将来的にはコロンの間に本当の 16 進数のデータが含まれるようになるからです。 美的な理由からこれを削除すると、IPv6 ネットワークに切り替えたとき、または IPv6 アドレスに直面したときに、コードが壊れてしまいます。
いくつかのネットワークは現在 IPv6 を実行しており、まもなく IPv6 IP アドレスに直面するでしょう。今すぐ移行するか、将来的にコードを破壊するリスクを負ってください。
現在 IPv6 を実行しているネットワークもあります。
この問題の TL;DR(ショート)バージョンは、次のとおりです。すべてがうまくいっています。 変更しないでください。これは IPv4 アドレスの IPv6 バージョンです。
IPv6 と互換性のあるコードにしたい場合、あなたがしなければならないのは、そのコードが
::ffff:
プレフィックスがあればそれを取り除き、残りをIPv4として処理します。
::ffff:
が存在しない場合、それはIPv6アドレスであり、そのように処理される必要があります。
文字列にピリオドがあるかどうかを確認することでダブルチェックすることができます。
IPアドレスに必要な調整以外のすべてにおいて、IPを記録しているだけであることに留意してください。 パーサーとログ アグリゲートにとって重要なのは、IP アドレスに対応するために
::ffff:127.0.0.1
などが将来的に重要になります。 IPを変更する必要がない限りは、受け取ったままの状態にしておけばいい。
関連
-
[解決済み】Express.js req.bodyが未定義です。
-
[解決済み】nodemon - app crashed - waiting for file changes before start
-
[解決済み] エラーメッセージ MongoError: bad auth URI 文字列で認証に失敗しました。
-
[解決済み] NodeJsのSequelizeでautoIncrementはどのように動作するのですか?
-
[解決済み] エラー: ノード出力を "|head" にパイプするときに EPIPE を書き込む。
-
[解決済み] Node.js上のExpress.jsでGET(クエリ文字列)変数を取得する方法とは?
-
[解決済み] Express.js - app.listen vs server.listen
-
[解決済み] express.js で HTTPS を有効にする
-
[解決済み] Express.jsとは?
-
[解決済み】Node.js / Express.js - app.routerはどのように動作するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】npx コマンドが見つかりません。
-
[解決済み】MongoDBのデータ/DBが見つからない
-
[解決済み】モジュール '@babel/core' が見つかりません。
-
[解決済み】Node.jsのホスト名/IPが証明書のaltnamesと一致しない。
-
[解決済み】Mongooseで配列の値を更新する方法
-
[解決済み】npm 5で作成されたpackage-lock.jsonファイルはコミットするのでしょうか?
-
[解決済み] エラーメッセージ MongoError: bad auth URI 文字列で認証に失敗しました。
-
[解決済み] エラーです。Cannot find module 'ejs'
-
[解決済み] Macでポート3000をロックしているプロセスを見つける(そして殺す)【終了
-
[解決済み] npm not able to find a fileに関連するエラーは何が原因でしょうか?node_modules サブフォルダ内にコンテンツがありません。なぜでしょうか?