サイトを常時SSL通信にしたら設定しておきたいセキュリティヘッダー(HSTS)。
.htaccessに必要な記述を追加するだけですし、いろいろなサイトに情報が載っているのでそれを見ながら設定している方も多いと思います。
しかしきちんと記述をしないと、WordPressの特徴である段落ブロックなどにURLを入力されると自動で埋め込みカード化される機能(embed)が働かず、編集画面では以下のような画面が表示され、表示画面では文字列リンクのみになってしまう現象が発生します。

今回はこの現象が発生する原因と対策の例を備忘録を兼ね紹介しておきます。
HSTSを追加したらリンクがカード化されない原因
WordPressでセキュリティヘッダーを出力するには主に以下の方法があります
- セキュリティヘッダー追加用のプラグインを使用する
- .htaccessファイルに記述を追加する
- テーマのfunctions.phpなどから出力する
1の方法で出力している場合に問題が発生したら、そのプラグインの公式フォーラムなどで解決していただくとして、2と3の場合に起こり得る原因は、以下の記述に問題があります。
※コードの内容は一例です
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Content-Security-Policy: object-src 'none'
どちらもブラウザーがページを <embed>、<object> の中に表示することを許可するかどうかを示すために使用しますが、まず上の「X-Frame-Options」というヘッダーは既に多くのブラウザで対応していないので記述する必要がありません(記述があれば削除して構いません)。
その代わりとなるのが下の「Content-Security-Policy(略してCSPと呼ばれます)」というヘッダーで、このヘッダーのアクセス制限を行う記述によってアクセスが拒否されるため、カード化されないという現象が発生します。
他サイトからのリンクカード化を許可するCSPの書き方
問題のコードをもう一度掲載します。
Header always set Content-Security-Policy: object-src 'none'
この中の「 object-src ‘none’」という部分がアクセスを許可(拒否)する範囲の指定になっていて、この部分は恐らくコードを提供しているページごとに違うと思います。
このコードを以下のように記述することで、自身(同一のドメイン)とSSL通信からアクセスするすべてのサイトからのアクセスを許可し、リンクをカード化できるようになります。
Header always set Content-Security-Policy: frame-ancestors 'self' https://*
ただしこれは非SSLのページからのアクセスを拒否するだけで、その他は何も制限をしない状況となり、あまり意味をなさないかも知れません(それでもSSL通信に限定することである程度の効果は期待できます)。
これを厳密なものにするには、以下のように許可するドメインを絶対指定するのが一番です。
Header always set Content-Security-Policy: frame-ancestors 'self' https://xxx.com https://xxx.jp
この設定では、self(自身のドメイン)、xxx.comというドメイン、xxx.jpというドメインからのアクセスを許可(カード化可能にする)し、その他のドメインからは拒否するようになります。
もしもSSL通信しているどのドメインからもカード化できるようにしたいということでなければこのようにして許可する範囲を限定することで、無碍にリンクをカード表示(情報の取得を許可)されなくなり、セキュリティアップを図ることができます。
以上、HSTS(セキュリティヘッダー)を追加したらリンクがカード化されなくなる原因と対処方法でした。
ちなみに.htaccessへ直接記述せず、有効化しているテーマのfunctions.phpからセキュリティヘッダーを追加したい方は以下のページを参考にしてください。
コメントを残す