先日、CloudflareでキャッシュしているWordPress上で動画を再生させたいというご依頼があって試してみたところ、なぜかスマホでだけ非常に不安定でタイムアウトが連発するという現象に遭遇しました。
iPhone+MacのWebインスペクションで調べてみると、最初の接続時のステータスが200。それから206の接続が4つくらいほぼ同時に発生しており、明らかに動作がおかしいです。しかし、サーバIPアドレス指定でのURLで動画にアクセスすると問題なく再生されます。
調べてみた所、どうやらCloudflareは動画ファイルでも最初に200を必ず返し、そしてスマホブラウザの多くは動画再生の最初に206ステータスが返ってこないときちんと再生されないとの事でした。
その対策方法として、Cloudflareのページルールでキャッシュをバイパスする方法が色々と紹介されていたり、nginxやapache側で色々なヘッダー情報を書き換えるような設定を加える事が推奨されていましたが、どれも効果なし。
結局、動画にアクセスされた場合にドメインではなくサーバーIP指定でのURLでの動画URLにリダイレクトさせる方法で回避しました(このサーバはマルチドメインではなかったので助かりました)。
ただ、私の場合はここで更に問題が。実はログインユーザにしか動画再生させたくないという仕様の指定があって、PHPファイル内で認証処理と部分ダウンロード処理をしていたのですが、先程のサーバーIP指定でアクセスすると元々のドメインから外れてしまうので、セッションを確認する事ができず認証がうまく行かなくなるのです。
なので、次のように処理を実装しました。
まず、リダイレクトするファイルでWordPress認証し、認証が通ればサーバーIP指定の動画再生PHPにリダイレクトします。この際にパラメータとして「ユーザパスのハッシュとユーザのIPを繋げた文字列のハッシュ」を付けます。
そして、動画再生PHPではユーザパスのハッシュとユーザのIPを繋げた文字列のハッシュを作成し、GETパラメータと比較し、一致したら再生を開始します。
ここで更に問題が。
なんとCloudflareはデフォルトでIPv6を強制してくるのです。つまり、WordPressのドメインでアクセスしてきた場合(この場合はリダイレクトするファイル)にはIPv6しか確認する事ができず、サーバIPアドレス指定の場合はIPv4しか確認できない、という状況になってしまっていたのです。サーバのネットワーキングをIPv6にすればいいのですが、それに絡んだ作業が色々発生してくるので稼働サイトで行うには非常にリスクが伴います。
調べた所、CloudflareはIPv6ネットワーキングを有料ユーザでしか解除できないのですが、無料ユーザでもAPIを叩けば解除出来るそうです。
コンソールから
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/ゾーンID/settings/ipv6" -H "X-Auth-Email: メアド" -H "X-Auth-Key:グローバルAPIキー" -H "Content-Type: application/json" --data '{"value":"off"}'
を叩けば一発です。
こうして無事にIPアドレス不一致問題も解決して動作するようになりましたが、Cloudflareがいつ完全にIPv6に移行するか分からないので、いつかは本格的なIPv6移行も必要になってくるでしょう。
コメント