初投稿です。かなり見苦しい記事になっていますがご容赦ください。
やりたかったこと
nginx+phpで動いてるサーバーで404のエラーページを別のページに飛ばしたい(404のリクエストはhttp://ドメイン/example/index.phpを参照させたい)。
nginxのlocationで飛ばせば楽なんだけど複数ドメインを1つのserverディレクティブで管理していて、ドメインごとにエラーページの仕様が違う(元々404は/html/ドメイン/error_page.phpを参照することになっている)のでそれは無理。なのでphpでリダイレクトを掛けることにした。
headerで飛ばそうとしたらうまくいかない
phpのリダイレクト方法を調べたら
<?php
header('Location: http://example.com/');
exit;
?>
を使ってる記事が多かった。
この方法でパパっとerror_page.php作ってサーバーに置いて動作確認。
http://ドメイン/error_page.phpにアクセスしたらちゃんとhttp://ドメイン/example/index.phpに飛んでるし問題ないかと思った。
だけど、試しにhttp://ドメイン/hoge.html(存在しないファイル)にアクセスしたら画面が真っ白で何も表示されない。nginxからリダイレクト掛けるとphpが動作しないのかと思ってechoとかphpinfo()とか試したらこれは動く。これで見事にハマった。
原因
色々調べてたらこのフォーラムが見つかった。
要は「header関数はページの先頭で呼び出す必要があってnginxとかのホストから呼び出された時は上手くいかないよ!代わりに別のリダイレクト使ってね。」みたいな事らしい。
header関数を使う時はファイルの先頭を<?phpから始めないとダメで改行1個あるだけで動かないらしく、その辺が影響したのかと思われる。
まとめ
言われた通り別のリダイレクトを使うことにした。
さっきのフォーラムに書いてあった
echo "\<meta http-equiv='refresh' content='0;url=http://ドメイン/example/'>";
でリダイレクトしてあげれば無事に飛ばせるようになりました。