📷

WordPress でメディアがアップロードできなかった

2016/09/29に公開

状態

  • BlueOnyx 上にサブドメインとして追加したサイト
  • WordPress でメディアがアップロードできない
  • エラー内容 一時フォルダが見つかりません。
  • テーマのインストールとかはできる
  • もちろん WordPress 自体は閲覧できるし、ドメインも浸透している
  • メインサイトの方の WordPress ではアップロードが行えている

一時フォルダってどれのこと?

WordPress のことはあまり詳しくないので、一口に「一時フォルダ」といっても WordPress に用意されてあるものなのか、それともルート直下にある tmp フォルダなのかわからなかった。

とりあえずエラー出たページの php ファイルを開いてみる。

アップロードが行われているのは27行目あたり。

if ( $_POST ) {
	if ( isset($_POST['html-upload']) && !empty($_FILES) ) {
		check_admin_referer('media-form');
		// Upload File button was clicked
		$upload_id = media_handle_upload( 'async-upload', $post_id );
		if ( is_wp_error( $upload_id ) ) {
			wp_die( $upload_id );
		}
	}
	wp_redirect( admin_url( 'upload.php' ) );
	exit;
}

アップロード失敗しているときに最初に見るのは $_FILES の中身だ。
print_r( $_FILES ); exit; をとりあえずコードに突っ込みアップロードしてみると、tmp_name がないし、error に 6 が入っていた。

あ!これって /tmp フォルダが原因のやつだ!

良くあるやつですな。
エラーログを見ると PHP Warning: File upload error - unable to create a temporary file in Unknown とある。
はいはい。いつものやついつものやつ。

で、該当のフォルダを見に行くとパーミッションが以下のようになっていた。
drwxrwxrwxt
最後の t はスティッキービットと呼ばれるやつで、詳しいことは WikiPedia 先生にでも聞いてほしい。
簡単に言うと所有者しか操作できないってことだ。
で、所有者は root である。
まぁ、ここまではよくある話だ。
セキュリティを担保するために良く行われる設定なので特に問題はない。
そしてメインの WordPress でアップロードできるので問題はここではない。

じゃぁどこよ?

BlueOnyx の設定画面を開きましょうかね。
BlueOnyx-PHP-setting.png
はい。こちらになります。
Open Basedir (Vsite) ってところが空っぽなせいじゃね?
/tmp/ を入れて Save っと。
だがしかし、
反 映 さ れ な い !
何故って思ったけど、よくわからない。
誰か教えて。

無理やり解決したよ。

この設定の実体ファイルがどこかにあるはずなので探し回った。
/etc/httpd/conf.d/subdomains/ の直下にあった。

php_admin_value open_basedir /usr/xxxxxxxxxxx/configs/php/:/home/.sites/XXX/siteXXX/

無いと思っていたが、 open_basedir の記述が書かれている。
もしかしたら弄れないような仕様なんだろうか?(それなら管理画面にないと思うけど)

ま、よくわからないので以下のように書き換えて、 Apache をリロード。

php_admin_value open_basedir /usr/sausalito/configs/php/:/tmp/:/home/.sites/111/site30/

これでアップロードできるようになった。

注意事項

これはあくまで BlueOnyx のサーバ管理者だからできたことで、普通のユーザにはできない。
何か方法があればいいんだけど…。

Discussion