現状と問題
現在、phantomjsを利用しており、プロキシ経由でスクレイピングや
レスポンスタイムの計測などを行いたいと考えております。
そこで、http://<フォワードプロキシIP>でアクセスを行い、
phantomjsのapi機能のcustomHeadersでヘッダを付与して、
プロキシ経由で、アクセスを行いました。
結果、http://<対象のFQDN>とhttp://<対象FQDN>/main.jsの2つのみ
プロキシ経由で、アクセスを行い、その他の対象FQDNのコンテンツは、
オリジンに直接とるような振る舞いをしていました。(tcpdumpの結果)
対象FQDNのすべてのコンテンツがプロキシを経由してアクセスをするためには、
どのように設定すればいいでしょうか。
(但し、hostsファイルを書き換えてしまうのはなしでお願いいたします。)
また、なぜこのようになっているのかもご教授していただけると幸いです。
<phantomjsのコード>
var fs = require('fs'), page = require('webpage').create(), system = require('system'), fqdn = system.args[1], proxyIp = "http://10.16.17.34"; arrdata = fqdn.split(/\r\n|\n|\r/); // 読み込んだurl.txtを配列へ格納 var urltmp, urlarr = []; while ((urltmp = arrdata.shift()) !== undefined) { if (urltmp !== "") urlarr.push(urltmp); } var a = 0; function createHAR(address, title, startTime, resources) { var entries = []; resources.forEach(function (resource) { var request = resource.request, startReply = resource.startReply, endReply = resource.endReply; if (!request || !startReply || !endReply) { return; } if (request.url.match(/(^data:image\/.*)/i)) { return; } entries.push({ startedDateTime: request.time.toISOString(), time: endReply.time - request.time, request: { method: request.method, url: request.url, httpVersion: "HTTP/1.1", cookies: [], headers: request.headers, queryString: [], headersSize: -1, bodySize: -1 }, response: { status: endReply.status, statusText: endReply.statusText, httpVersion: "HTTP/1.1", cookies: [], headers: endReply.headers, redirectURL: "", headersSize: -1, bodySize: startReply.bodySize, content: { size: startReply.bodySize, mimeType: endReply.contentType } }, cache: {}, timings: { blocked: 0, dns: -1, connect: -1, send: 0, wait: startReply.time - request.time, receive: endReply.time - startReply.time, ssl: -1 }, pageref: address }); }); return { log: { version: '1.2', creator: { name: "PhantomJS", version: phantom.version.major + '.' + phantom.version.minor + '.' + phantom.version.patch }, pages: [{ startedDateTime: startTime.toISOString(), id: address, title: title, pageTimings: { onLoad: page.endTime - page.startTime } }], entries: entries } }; } var page = require('webpage').create(), system = require('system'); // カスタムヘッダーの追加 page.customHeaders = { "Host" : urlarr[a].replace(/http\u003a\u002f\u002f|https\u003a\u002f\u002f/g, "") } if (system.args.length === 1) { console.log('Usage: netsniff.js <some URL>'); phantom.exit(1); } else { page.address = system.args[1]; page.resources = []; page.onLoadStarted = function () { page.startTime = new Date(); }; page.onResourceRequested = function (req) { page.resources[req.id] = { request: req, startReply: null, endReply: null }; }; page.onResourceReceived = function (res) { if (res.stage === 'start') { page.resources[res.id].startReply = res; } if (res.stage === 'end') { page.resources[res.id].endReply = res; } }; page.open(proxyIp, function (status) { var har; if (status !== 'success') { console.log('FAIL to load the address'); phantom.exit(1); } else { page.endTime = new Date(); page.title = page.evaluate(function () { return document.title; }); har = createHAR(proxyIp, page.title, page.startTime, page.resources); console.log(JSON.stringify(har, undefined, 4)); phantom.exit(); } }); }
<実行方法(cli)>
phantomjs test.js <対象のFQDN>
<tcpdumpのログ>
1461570272.645 1039 121.119.165.247 TCP_MISS/200 10284 GET http://<対象FQDN>/ - DIRECT/<対象FQDN> text/html
1461570274.328 545 121.119.165.247 TCP_MISS/555 0 GET http://<対象FQDN>/main.js - DIRECT/<対象FQDN> -
<プロキシについて>
Nginxでフォワードプロキシになっており、
フォワードプロキシを向け先にして、ホストヘッダをつければ、
プロキシしてくれる設定となっております。
(ここの設定は、他のことでも利用しているため関係ないと思われます。)
あなたの回答
tips
プレビュー