Vue.jsに動的OGP画像を実装する方法3選

OGP画像の重要性 ogp画像はシェアされた際に、シェアした人のタイムラインにページタイトル・URL・概要・画像を表示させる仕組みのことを指します。OGPを正しく設定することで訴求力が高まり、SNSからの訪問者を増やすことに繋がります。 しかしながらTwitterのクローラーはjavascriptを実行しない為、Vueを用いたSPAではindex.htmlに設定されたOGP画像のみ返す事ができます。つまりurl毎にOGP画像を変えたり、文章や画像を生成することはVue単体では不可能です。 1. Server Side Rendering サーバーサイドレンダリング(SSR)はその名の通りサーバー側でアプリケーションの HTMLを生成し、レスポンスとして返すことを言います。SPAは表示したいものがあれば、都度APIから取得してくるのに対してSSRは初回のみAPI通信が不要なHTMLを返すのです。初月のみ無料、初月以降月額料金になるサブスクみたいな感じですかね。 URLによってJavascriptを使わずにHTMLファイルを変えられるので、動的にOGPも編集できます Pros: ページの読み込み高速化、SEOにも良い Cons: SPAを作り直す必要がある、技術取得コストが高い 要件定義の段階のプロジェクトにはSSRは有力な候補になります。既存のSPAアプリをSSRに変更するにはとても時間がかかりそうです。 2. Dynamic Rendering ダイナミック レンダリングとは、特定のユーザーエージェントを対象に、クライアント側でレンダリングされるコンテンツとプリレンダリングされるコンテンツを切り替えることを指します。人によって態度を変える上司みたいな感じだと考えれば想像に難くないですね。Twitter Botなど特定のクライアントの時のみOGP画像が設定されたHTMLファイルを返すことでURLごとに違うOGPを返す事ができます。 Pros: 導入がSSRより簡単、SEOにも良い Cons: 画像や文章の生成が動的にできない 3. バックエンド側がOGPを返す フロントエンドURLへのリダイレクトとOGPがセットされたHTMLファイルを返すエンドポイントをバックエンドで実装します。Twitter クローラーはjavascriptを実行しないのでOGPのみ表示するのに対し、エンドポイントにアクセスしたユーザーはフロントエンドにリダイレクトされます。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta property="og:title" content="タイトル"> <meta property="og:image" content="画像"> <meta property="og:description" content="サイトの説明"> <meta property="og:url" content="サイトのURL"> <meta property="og:type" content="website"> <meta property="og:site_name" content="サイトの名前"> <meta name="twitter:site" content="@tos"> <meta name="twitter:card" content="summary"> <meta name="twitter:title" content="タイトル"> <meta name="twitter:image" content="画像"> <meta name="twitter:description" content="説明"> <script> window....

March 24, 2022 · 1 min

fastapi+uvicornでInvalid HTTP request received

invalid HTTP request received 本番環境でfastapiを動かしている時に以下のエラーが出力されました。 INFO: Started server process [9806] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) WARNING: Invalid HTTP request received. Traceback (most recent call last): File "/home/ec2-user/.local/lib/python3.7/site-packages/uvicorn/protocols/http/h11_impl.py", line 170, in handle_events event = self.conn.next_event() File "/home/ec2-user/.local/lib/python3.7/site-packages/h11/_connection.py", line 443, in next_event exc._reraise_as_remote_protocol_error() File "/home/ec2-user/.local/lib/python3.7/site-packages/h11/_util.py", line 76, in _reraise_as_remote_protocol_error raise self File "/home/ec2-user/.local/lib/python3.7/site-packages/h11/_connection.py", line 425, in next_event event = self....

March 22, 2022 · 2 min

リモートサーバー内でのdocker-composeエラー

最近はdocker-composeの使い過ぎでdockerのコマンドを忘れてきました。今回はこちらの記事を参考にdocker-composeでリモートサーバーにデプロイしようとした時に発生したエラーの備忘録です。 永遠にpassphrase/password を求められる docker -c [context_name] [command]を使用したときに出現しました。以下のコマンドを打つとエラーが消えます。 eval $(ssh-agent -s) && ssh-add 人によってはeval $(ssh-agent -s)が無くても大丈夫かも。僕はssh-addだけだとエラー出ました。 broken pipe error / 255 version mismatch error ssh先に、docker-compose -c [リモートサーバーのcontext] upと入力したら出現しました。 解決策はCOMPOSE_DOCKER_CLI_BUILD=0をコマンドの先頭に入力することみたいです。 先程の例では、このように入力することが正解だったみたいです。 COMPOSE_DOCKER_CLI_BUILD=0 docker-compose -c [リモートサーバーのcontext] up 参考 docker-connect-to-remote-daemon-via-ssh-permission-denied-publickey | stackoverflow docker-compose #8218 | github

March 21, 2022 · 1 min