2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

nginxのエラーページをphpのheaderで別ページに飛ばせなかった

Last updated at Posted at 2018-03-09

初投稿です。かなり見苦しい記事になっていますがご容赦ください。

やりたかったこと

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/'>";

でリダイレクトしてあげれば無事に飛ばせるようになりました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?