情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

expressモジュールによるHTTPサーバ(3)クライアントに関する情報の取得

この記事は「expressモジュールによるHTTPサーバ」という連載記事の3つ目の記事です。

その他の記事に関しては下を参照してください。

また、HTTP自体について知りたい方は下を参照してください。

この記事ではexpressモジュールを使ってクライアントに関する情報の取得を行うHTTPサーバを作成する方法について説明します。

プロキシに関する設定項目

プロキシに関するアプリケーションの設定項目としてtrust proxy設定項目があります。

これはサーバ側のプロキシを設定するためのものであり、デフォルトはfalseです。

falseを指定した場合にはサーバ側にはプロキシが存在しないものと見做します。

trueを指定した場合にはHTTPリクエストヘッダのX-Forwarded-Forフィールドに設定されているプロキシの全てがサーバ側のプロキシであると見做します。

IPアドレスやサブネットを文字列として指定することもできます。複数のIPアドレスやサブネットを指定する場合には,で区切るか、文字列の配列として指定します。

また、特定のIPアドレスやサブネットを表す特別な文字列を指定することもできます。

  • loopback・・・127.0.0.1/8, ::1/128を表します。
  • linklocal・・・169.254.0.0/16, fe80::/10を表します。
  • uniquelocal・・・10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7を表します。

IPアドレスやサブネットを指定した場合にはIPアドレスが一致するプロキシやサブネットに含まれるプロキシがサーバ側のプロキシであると見做します。

数値を指定することもできます。

数値を指定した場合にはサーバ側から数えて数値個分のプロキシがサーバ側のプロキシであると見做します。

関数を指定することもできます。

この関数の第1引数はIPアドレスです。

この関数ではIPアドレスがサーバ側のプロキシのものである場合にはtrueを返すようにします。

クライアントのIPアドレス

req.ipにはクライアントのIPアドレスが格納されています。

var express = require('express');

var app = express();
app.use(function (req, res, next) {
    var ip = req.ip;
    next();
});

このIPアドレスはHTTPリクエストヘッダのX-Forwarded-Forフィールドの値などから導出されます。

クライアントとプロキシのIPアドレス

trust proxy設定項目の値がfalse以外である場合にはreq.ipsにはクライアントとプロキシのIPアドレスが配列として格納されています。

app.use(function (req, res, next) {
    var ips = req.ips;
    next();
});

このIPアドレスはHTTPリクエストヘッダのX-Forwarded-Forフィールドの値から導出されます。

サンプルコード1

クライアントからリクエストを受け取ったらクライアントに関する情報を標準出力に出力するHTTPサーバを作成し、起動します。

Enterキーが押されたらサーバを停止し、プログラムを終了します。

express-server-client-info.js

var express = require('express');

var app = express();
app.set('env', 'development');
app.set('x-powered-by', false);
app.set('case sensitive routing', true);
app.set('strict routing', true);
app.use(function (req, res, next) {
    console.log('requested.');
    console.log('ip: ' + req.ip);
    console.log('ips: ' + req.ips);
    next();
});
var server = app.listen(3000, function () {
    console.log('http server is running...press enter key to exit.');

    process.stdin.on('data', function (data) {
        if (data.indexOf('\n') !== -1) {
            server.close(function () {
                console.log('http server closed.');
                process.exit(0);
            });
        }
    });
});
server.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

使用パッケージ

  • express
    npm install expressでインストールします。

実行結果

実行結果の確認のためにcURLを使用しています。

コードを実行するとHTTPサーバが起動します。

C:\work\node>node express-server-client-info.js
http server is running...press enter key to exit.

cURLを使ってサーバに対してHTTPリクエストを行います。

C:\work\node>curl -v http://localhost:3000/
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET / HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 404 Not Found
< X-Content-Type-Options: nosniff
< Content-Type: text/html; charset=utf-8
< Content-Length: 13
< Date: Wed, 06 Jul 2016 08:48:43 GMT
< Connection: keep-alive
<
Cannot GET /
* Connection #0 to host localhost left intact

クライアントに関する情報が正しく取得できていることが分かります。

C:\work\node>node express-server-client-info.js
http server is running...press enter key to exit.
requested.
ip: ::1
ips:

Enterキーを押すとサーバが停止し、プログラムが終了します。

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-express, Node.js