下のボタンよりご支援をお願い致します!

OK Desu Ka?

Chrome/Edge/Safariなどのブラウザで動画/音声のシークバーが動かせない/先送りできない問題について

synology

はじめに

audio/videoタグで表示されている動画/音声をシークできない時がある。
動作確認した環境は下記の通り。

  • サイト(CMS) – WordPress
  • Webサーバ – Synology NASのパッケージ「Web Station」で構築されたApache HTTP Server 2.4
  • ブラウザ – Google Chrome
  • DDNSサービス – Cloudflare
  • シークできるヤツ

  • シークできないヤツ

違いは何なのか。

原因

下記いずれか。

  1. Apacheサーバの設定
  2. Cloudflare

Firefoxでは問題なくシークできる。

ブラウザによる挙動の違いは「仕様!」と言ったらおしまいなのだが…
ChromeでHTTPステータスコードが200のファイルを開く場合、ファイル全体をダウンロードすることを拒否し、currentTimeプロパティが利用不可となる仕様のためシークができなくなる(ただしファイルサイズが小さい場合はシークできる)
公式のソースが見つからなくてうまく説明できないが、そういうこと(仕様)なのだ。

HTTPステータスコードの調べ方

ターミナル(コマンドプロンプト)を開き、下記curlコマンドを使うとHTTPステータスコードを確認できる。


del alias:curl
curl -H Range:bytes=16- -I https://baikin.net/wp-content/work/html/seek/ok/nyancat60min.mp3
curl -H Range:bytes=16- -I https://baikin.net/wp-content/work/html/seek/ng/nyancat60min.mp3
  • シークできるヤツ – HTTP/1.1 206 Partial Content

  • シークできないヤツ – HTTP/1.1 200 OK

対処法

Chromeでシークしたい場合、HTTPステータスコードは206で返される必要がある。

Apacheサーバの設定を確認する

  1. XSendFileモジュールをインストールする
  2. 
    sudo apt-get update
    sudo apt-get install libapache2-mod-xsendfile
    
  3. apacheのconfファイルに下記を追記し、指定フォルダパス配下のファイル送信を許可する
  4. 
    XSendFile on
    XSendFilePath /volume1/web/baikin/wp-content/work/html/seek/ok
    
  5. WordPress設定ファイルwp-config.phpファイルへの追記(不要かも?)
  6. 
    define( 'WPMU_SENDFILE', true );
    

Synology NAS内に用意されたパッケージ「Web Station」を利用している場合はXSendFileがインストール・設定済みなので気にしなくて良い。

  • Synology NAS内のXSendFile定義箇所
    ※SSHサービスを有効化し、Synology NASにログインすること
    • Apacheサーバ設定ファイル – 111行目でXSendFile設定を行っているファイルを呼び出している
      格納場所: /usr/local/etc/apache24/conf/httpd24.conf
      ※viコマンドでファイルを開く / 保存しないで終了: Esc押下後「:q!」と入力して↵キー
    • 
      # TODO: Should apapche handle FileETag
      # For CVE-2003-1418
      FileETag MTime Size
      
      Include conf/extra/httpd-mpm.conf
      Include conf/extra/httpd-autoindex.conf
      Include conf/extra/httpd-languages.conf
      Include conf/extra/mod_xsendfile.conf
      Include conf/extra/mod_rpaf.conf
      
      IncludeOptional sites-enabled/*.conf
      
    • 呼び出されていたmod_xsendfile.confファイルの中身 – XSendFileが設定されている
      格納場所: /usr/local/etc/apache24/conf/extra/mod_xsendfile.conf
      ※viコマンドでファイルを開く / 保存しないで終了: Esc押下後「:q!」と入力して↵キー
    • 
      LoadModule xsendfile_module modules/mod_xsendfile.so
      
      XSendFile on
      XSendFilePath /var/services/web /var/services/homes
      SetEnv MOD_X_SENDFILE_ENABLED yes
      

DDNSサービスにCloudflareを利用している場合

Cloudflare側で負荷を軽減するためApacheサーバのXSendFile設定とは関係なくシークできなくしてくる。
下記コードが記載された.htaccessファイルを、動画/音声が格納されているフォルダ内に格納すれば良い。


SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI .(mp3|ogg|wav|mp4|ogv|webm)$ no-gzip dont-vary