このブログは、ConoHa の VPS に自分で WordPress を構築して動かしています。
WordPress のインストールまでは順調だったのですが、テーマの Cocoon をアップロードしたところで、いきなりつまずきました。
このリンクの有効期限が切れています。
リンク? 期限? ファイルをアップロードしただけなのに、何の期限が切れたのか、最初はまったく分かりませんでした。
環境
- ConoHa VPS
- Ubuntu 22.04
- Apache + PHP 8.1(apt でインストール)
- WordPress(WP-CLI でインストール)
原因は PHP のアップロード上限だった
調べてみると、原因は PHP の設定でした。
Ubuntu の apt で入れた PHP は、アップロードできるファイルのサイズが最初はかなり小さく設定されているそうです。
| 設定 | 初期値 | 意味 |
| upload_max_filesize | 2M | 1ファイルあたりの上限 |
| post_max_size | 8M | 1回の送信全体の上限 |
Cocoon の zip はこれより大きいので、PHP の段階で受け取ってもらえていませんでした。
それを WordPress が「送られてきたデータがおかしい」と判断して、あのメッセージを出していたようです。
エラーの文言と原因がまったく結びつかないので、これは分からないなと思いました。
仕事ではレンタルサーバーの WordPress を触ることが多いのですが、レンタルサーバーだと最初から上限が大きめに設定されていることが多く、意識したことがありませんでした。
VPS で自分で構築して、初めて出会ったエラーです。
やったこと:設定ファイルを追加した
php.ini を直接書き換える方法もありますが、今回は conf.d というフォルダに、設定を追加するファイルを置く方法にしました。
元の php.ini をいじらずに済み、あとから「何を変えたか」が分かりやすいからです。
sudo tee /etc/php/8.1/apache2/conf.d/99-upload.ini <<'EOF2'
upload_max_filesize = 64M
post_max_size = 64M
EOF2
sudo systemctl restart apache2
Apache を再起動してからもう一度アップロードしたら、無事に Cocoon をインストールできました。
ファイル名の 99- は、読み込まれる順番を最後にするためのものです。同じ設定がほかにあっても、最後に読み込まれたものが使われるそうです。
.htaccess に書く方法と何が違うのか
検索すると、.htaccess に書く方法もよく出てきます。
php_value upload_max_filesize 64M
php_value post_max_size 64M
どちらでも同じでは?と思って違いを調べてみたら、こういう違いがありました。
| php.ini(conf.d) | .htaccess | |
| 効く範囲 | サーバー全体 | そのフォルダ以下 |
| 変更できる人 | rootのみ | WordPress のフォルダに書き込める人 |
| 動く条件 | いつでも | PHP を mod_php で動かしているときだけ |
.htaccess は、root 権限がないレンタルサーバー向けの方法なんですね。
PHP-FPM で動かしている環境だと、php_value を書くと 500 エラーになるそうです。
セキュリティを勉強している身として気になったのは、.htaccess は WordPress 自身が書き換えられるファイルだという点です。
つまり、もしサイトが乗っ取られたら、攻撃者にも書き換えられてしまいます。
実際、乗っ取られたサイトの .htaccess に不正なリダイレクトが仕込まれる手口はよくあるそうです。
VPS で root 権限があるなら、php.ini 側で設定しておくほうが安心だと感じました。
今後のための自分用メモ
今回の設定ファイルは /etc/php/8.1/ の下に置いています。今後 Ubuntu をアップグレードする予定なのですが、PHP のバージョンが変わると設定ファイルの場所も変わるので、この設定は引き継がれないはずです。
アップグレードしたら、ちゃんと確認しようと思います(その様子もまた記事にする予定です)。
まとめ
- 「このリンクの有効期限が切れています」の正体は、PHP のアップロード上限オーバーだった
- Ubuntu の PHP は、初期値が 2MB と小さい
/etc/php/バージョン/apache2/conf.d/に設定ファイルを追加して、Apache を再起動したら直った- root 権限があるなら、.htaccess より php.ini 側で設定するほうが安全そう
エラーの文言だけ見ても原因にたどり着けない、いい勉強になりました。同じところでつまずいた方の参考になればうれしいです。