IMUZA.com

Xserver<<WordPress(ConoHa)<<はてなブログ

ホーム / javascript / node.js で URLパースすると favicon.ico が返る

node.js で URLパースすると favicon.ico が返る

2019/02/4 javascript, Node.js

はてなのブログカードはたとえ自サイトであっても別ウィンドウ(タブ)で開いてしまいますので、それを同じウィンドウで開くようにしようと思っているのですが、DOM操作ではうまくいかず、じゃあ、サーバーを立ち上げて、呼ばれたら指定のサイトから OGPデータを取得してブログカード用にコーディングして返せばいいんじゃないかということで試してみようと思います。

  • node.js でサーバーを立ち上げる
  • URL をパースする

node.js でサーバーを立ち上げる

ググればいっぱいヒットします。簡単ですね。

const http = require('http');
const server = http.createServer();
const fs = require('fs');


server.on('request', function(req, res){
  
  fs.readFile('./index.html', 'utf-8', function(err, data){
    res.writeHead(200, {'Content-Type' : 'text/html'});
    res.write(data);
    res.end();
  });


});


server.listen(8080);
console.log('Server running at http://localhost:8080/');

エラー処理も一切なしのチェック用ですが、同じディレクトリに

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Sample HTML</title>
</head>
<body>
    <h1>Hello World!</h1>
    <!-- 将来の文字列置き換え用 -->
    <p>@@content@@</p>
</body>
</html>

として、index.html を置いておき、コンソールから

$ node server.js 
Server running at http://localhost:8080/

として、ブラウザで http://localhost:8080/ にアクセスすれば、Hello World! と表示されます。

URL をパースする

で、やりたいことは、ブログカードにしたいサイトのアドレスをクエリパラメータとして送信し、そのアドレスから OGPデータを取得して、ブログカード用に整形して返すことですから、まずはクエリパラメータを取り出さなくてはいけません。

URLモジュールを使えばできるようで、あれこれやってみたのですがなかなかうまくいかず、どういうことだろうと次のコードでサーバーを立ち上げ、ブラウザから http://localhost:8080/?url=https://www.movieimpressions.com/entry/transit と打ち URLパースしてみました。

const http = require('http');
const server = http.createServer();
const urlParser = require('url');


server.on('request', function(req, res){
  console.log(urlParser.parse(req.url));
  res.end();
});


server.listen(8080);
console.log('Server running at http://localhost:8080/');

そうしましたら、何と、リクエストURLだけではなく、/favicon.ico が返ってくるではありませんか!?

Server running at http://localhost:8080/
Url {
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: '?url=https://www.movieimpressions.com/entry/transit',
  query: 'url=https://www.movieimpressions.com/entry/transit',
  pathname: '/',
  path: '/?url=https://www.movieimpressions.com/entry/transit',
  href: '/?url=https://www.movieimpressions.com/entry/transit' }
Url {
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: null,
  query: null,
  pathname: '/favicon.ico',
  path: '/favicon.ico',
href: '/favicon.ico' }

ただ、これは Chromeの場合で、FirefoxではリクエストURLだけで favicon.icoは返ってきません。

いろいろググってもなぜブラウザによって違うのかははっきりせず、対処法としては、

const http = require('http');
const server = http.createServer();
const urlParser = require('url');


server.on('request', function(req, res){
  
  if (req.url === '/favicon.ico') {
    console.log('favicon requested');
    res.writeHead(200, {'Content-Type': 'image/x-icon'} );
    res.end();
  }else{
    console.log(urlParser.parse(req.url));
    res.end();
  }
});


server.listen(8080);
console.log('Server running at http://localhost:8080/');

などと切り分ければOKということのようです。

そうしますとこんなんが返ります。

$ node server.js 
Server running at http://localhost:8080/
Url {
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: '?url=https://www.movieimpressions.com/entry/transit',
  query: 'url=https://www.movieimpressions.com/entry/transit',
  pathname: '/',
  path: '/?url=https://www.movieimpressions.com/entry/transit',
  href: '/?url=https://www.movieimpressions.com/entry/transit' }
favicon requested

結構長い間悩んでいましたがこれで次へ進めそうです(笑)。

iframe内の読み込みタイミングがわからない
Node.js でブログカードを返すアプリを作ってみた
Twitter
Facebook
ブックマーク
LINEで送る

最初のサイドバー

最新記事

2023/01/26

WordPress:メニューのid,classを整理カスタマイズ

2023/01/19

WordPress:JSON-LD構造化データをプラグインなしで出力

2023/01/11

WordPress:OGPタグをプラグインなしで挿入する

2022/12/27

WordPress:canonicalタグをプラグインなしで制御する

2022/12/21

WordPress:robotsメタタグをプラグインなしで制御する

最新記事を一覧で見る

よく読まれている記事

よく読まれている記事を一覧で見る

カテゴリー

  • はてなブログ214
  • WebTips108
  • javascript98
  • Joomla!88
  • Windows68
  • CSS63
  • Wordpress59
  • Joomla!更新53
  • Linux49
  • はてなテーマ45
  • Plamo33
  • Google32
  • はてなプラグイン25
  • php22
  • Node.js18
  • Ubuntu16
  • SASS16
  • laravel415
  • Chrome11
  • cms-style10
  • iPhone9
  • genesis6
  • ConoHa WING6
  • Git入門6
  • Python5
  • Android5
  • スマートフォン4
  • PC全般4
  • 静的サイトジェネレーター3
  • Firefox3
  • SSD3
  • Facebook3
  • Blankslate3
  • Docker3
  • Mactype2
  • GitHub2
  • youtube1
  • rails入門1
  • Twitter1
  • はてなブクマ1
  • 映画1
  • Xserver1

Footer

My Web Sites

  • @半径とことこ60分
  • そんなには褒めないよ。映画評
  • IMUZA.com
  • GitHub

Related Sites

  • WordPress公式
  • WordPress関数リファレンス
  • PHPマニュアル

Contact Us

  • お問い合わせフォーム
  • Twitter
  • Facebook
  • Feedly

Copyright © 2023 · IMUZA.com