WordPressでマルチサイトを構築したとき、
追加したブログから画像をアップロードすると表示されないという問題に遭遇。
環境は、
WordPress 3.2.1 PHP 5.2.9 Apache 2.0.64
調べてみると、
もともと存在しないパスをmod_rewriteで変更して、
wp-includes/ms-files.phpに渡してる様子。
渡されたパスをもとにms-files.phpで画像ファイルを読み込んでる。
WordPressが.htaccessに追加するようにいってきたコードは以下。
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]
画像はちゃんとアップロードされてるし、
mod_rewriteも問題ないようだ。
どうやらms-files.phpがうまく動いていないっぽい。
ms-files.phpは色々やってるけど、
ファイルを読み込んでるだけのプログラムなので、
キャッシュ部分抜きでそのまま同じようなのに置き換えることにした。
先ほどの.htaccessのRewriteRuleを以下に変更する。
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp_du/loadimg.php?dir=$1&file=$2 [L]
loadimg.phpはこのようにする。
<?php $url = $_GET['file']; $dir = $_GET['dir']; //NはブログID if($dir === 'N'){ $path = dirname( __FILE__ ).'/wp-content/blogs.dir/N/files/'.$url; } $pat = '/(gif$|jpg$|jpeg$|png$)/i'; preg_match($pat,$url,$match); $type = strtolower($match[0]); switch($type){ case gif: header("Content-type: image/gif"); echo(file_get_contents($path)); case jpg: header("Content-type: image/jpg"); echo(file_get_contents($path)); case jpeg: header("Content-type: image/jpeg"); echo(file_get_contents($path)); case png: header("Content-type: image/png"); echo(file_get_contents($path)); }
これを.htaccessと同じディレクトリに置く。
これで画像は表示されるようになったけど、
WordPress マルチサイト版の高速化アイデア : dogmap.jp
というのを見つけて、
こっちのほうがいいじゃんと思ったので.htaccessのみで対応することにした。
#NはブログID RewriteRule ^([_0-9a-zA-Z-]+/)?N/files/(.+) wp-content/blogs.dir/N/files/$2 [L]
これで無事に表示されるようになったので、
loadimg.phpは使わなかった。
でもなんでms-files.phpが動かないのかわからず。