質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

2回答

9142閲覧

【Node.js, Express,morgan】アクセス元IPアドレスの取得方法

koichi_

総合スコア20

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2020/06/24 01:44

前提・実現したいこと

下記サイト[1]を参考にnode.jsのExpressを使用したサーバのHTTPアクセスログを表示しようとしております。
morganモジュールにより、下記のようなアクセスログは表示されたのですが、nginx経由でアクセスしているため、すべてのipアドレスが自分自身(127.0.0.1)になってしまっています。

ここをアクセスしてきたIPアドレスを表示するように変更したいのですが、方法がございますでしょうか?

$ node index.js ::ffff:127.0.0.1 - - [24/Jun/2020:01:03:35 +0000] "GET /test/hello HTTP/1.1" 200 38 "-" "Wget/1.19.4 (linux-gnu)" ::ffff:127.0.0.1 - - [24/Jun/2020:01:04:19 +0000] "GET /test/hello HTTP/1.1" 200 38 "-" "Wget/1.19.4 (linux-gnu)" ::ffff:127.0.0.1 - - [24/Jun/2020:01:07:38 +0000] "GET /test/hello HTTP/1.1" 200 38 "-" "Wget/1.19.4 (linux-gnu)"

試したこと

下記参考サイト[2]を参考に、proxy_set_header X-Forwarded-Forの設定を行ったところ、
下記コードで実際のアクセス元IPを取得することはできました。

ただし、この場合すべてのapp.getにこの記述が必要ですし、できれば見やすいmorganのログのipアドレス部分を書き換えたく思っており方法を探しております。

app.get('/ip', (req, res) => { const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; res.send(ip); });

参考にしたサイト

[1]https://maku77.github.io/nodejs/express/access-log.html
[2]https://blog.capilano-fw.com/?p=5881

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi-sun

2020/06/25 07:54

> nginx経由でアクセスしているため、すべてのipアドレスが自分自身(127.0.0.1)になってしまっています。 NginxはNode.jsにとっては単なるクライアントなので127.0.0.1になるのは当然で、 リバースプロキシを採用する場合、基本的にはNginx側に手を加えるのが一般的です。 https://homemadegarbage.com/nginx-realip リバースプロキシ側でどうにかする場合、 ヘッダー部の「X-Forwarded-For」を書き換えてNode.js等のバックエンドはこの値を閲覧するのが慣習だったりします。 Nginxがこの「X-Forwarded-For」の書き換えをサボっており、 それを書き換える権限がないのであれば無理なんじゃないかと思います。
guest

回答2

0

わからんけどapp.allとかapp.useでパスなしで書いてnext()すればなんとかなりそう

javascript

1app.all('*', function(req, res, next){ 2 const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; 3 res.send(ip); 4 next(); 5});

投稿2020/06/24 03:08

sousuke

総合スコア3830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

0

AkitoshiManabeさんのコメントを元に調査したら
公式サイトにドキュメントがあるのを見つけました。
使い方も込みでちゃんと説明されてますね、安心

プロキシーの背後の Express

Express アプリケーションをプロキシーの背後で実行する場合、(app.set() を使用して) アプリケーション変数 trust proxy を次の表にリストされているいずれかの値に設定します。

app.set()メソッドを利用して、
Expressのアプリをtrust proxyモードで動作させます。

trust proxyを有効にすると、次の3つの重要な変更が起こります。

  • req.hostname の値は、クライアントまたはプロキシーが設定できる X-Forwarded-Host ヘッダーに設定された値から導き出されます。
  • X-Forwarded-Proto は、https と http のどちらであるか、または無効な名前であるかをアプリケーションに通知するためにリバース・プロキシーによって設定できます。この値は、req.protocol に反映されます。
  • req.ip および req.ips の値は、X-Forwarded-For のアドレス・リストから取り込まれます。

req.ipreq.ipsを確認すればX-Forwarded-Forも確認してIPアドレスを取得出来るようになります。


質問文のコードをふくらませる場合、
Expressにはミドルウェアがあるので自作ミドルウェアを作りましょう。

js

1const app = express(); 2 3// ミドルウェアはソースコードの上に定義 4// ミドルウェアを指定する場合、第三引数がnextという実行出来る関数になるので定義しておく 5app.use((req, res, next) => { 6 const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; 7 // req.remoteAddressみたいな適当なプロパティに保存しておく 8 req.remoteAddress = ip; 9 10 // next関数を実行すると、次のgetやall等を探しに行く。 11 next(); 12}); 13 14app.get('/ip', (req, res) => { 15 const ip = req.remoteAddress; 16 res.send(ip); 17});

投稿2021/11/16 04:51

miyabi-sun

総合スコア21203

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問