前回、こちらの質問をさせていただきまして、その結果下記の構成で構築を進めていました。
また少し躓いてしまったので、質問を書かせていただいております。
- VPS(さくらVPS)
- CentOS7
- Apache 2.4.6
- PHP 7.0.3(PHP-FPM)
PHP-FPMを利用するため、Apacheには下記の設定をしています。
apache
1# php-fpm用の設定 2ProxyPassMatch ^(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/$1 3DirectoryIndex /index.php index.php
これで、PHPファイルがFPM/FastCGIで動いていることを確認できました。
ここまでは良かったのですが、この後ちょっと困ったことになりました。
バーチャルホスト設定のところで、独自のエラー画面を出すために、ErrorDocumentを設定しました。
apache
1<Directory "/var/www/html"> 2 : 3 : 4 ErrorDocument 503 /error/503.html 5 ErrorDocument 404 /error/404.html 6</Directory>
これで、存在しないアドレスにブラウザアクセスすると、HTMLファイルや画像ファイル等は、思った通りのエラー画面(/error/404.html)が表示されるのですが、PHPファイルだけは、おそらくPHP-FPMの標準のエラー表示がされるようなのです。
その時の表示は、「File not found.」とのテキスト表示のみで、ステータスコードは404です。
PHPファイルはFCGIの実行パスに飛ばしているから、そこのディレクトリにErrorDocumentを設定しないといけないのかと思いますが、PHP-FPMの実行ディレクトリがどこなのか、そもそもそれで良いのか等が、なかなか調べても出てこなかったので、質問させていただきました。
こうした場合にPHPファイルにもErrorDocumentを適用するには、どのようにすればよいのでしょうか。
ご意見賜れますと幸いです。
よろしくお願いいたします。
###【20160225追記】
回答いただいた通りに、
この解決方法は、下記のサイトにもありました。
Apache 2.4 + PHP-FPM, catching error pages
結果、VirtualHostディレクティブの設定は以下のようになりました。
※今回の問題に関係ない記述もあると思いますが、念のためすべて掲載しました。
apache
1<VirtualHost *:80> 2 ServerName hoge.jp 3 DocumentRoot /var/www/html 4 5 ProxyErrorOverride On 6 ErrorDocument 503 /error/503.html 7 ErrorDocument 404 /error/404.html 8 ProxyPassMatch ^(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/$1 9 <Directory "/var/www/html"> 10 Require all granted 11 Options FollowSymLinks 12 13 # Expires settings 14 ExpiresActive On 15 ExpiresByType text/css "access plus 7 day" 16 ExpiresByType text/javascript "access plus 7 day" 17 ExpiresByType application/x-javascript "access plus 7 day" 18 19 # gzip transrate 20 RewriteEngine On 21 RewriteCond %{HTTP:Accept-Encoding} gzip 22 RewriteCond %{REQUEST_FILENAME} \.js$ [OR] 23 RewriteCond %{REQUEST_FILENAME} \.css$ 24 RewriteCond %{REQUEST_FILENAME} !\.gz$ 25 RewriteCond %{REQUEST_FILENAME}\.gz -s 26 RewriteRule .+ %{REQUEST_URI}.gz 27 28 <FilesMatch "\.js\.gz$"> 29 ForceType application/x-javascript 30 AddEncoding x-gzip .gz 31 </FilesMatch> 32 33 <FilesMatch "\.css\.gz$"> 34 ForceType text/css 35 AddEncoding x-gzip .gz 36 </FilesMatch> 37 </Directory> 38</VirtualHost> 39
その結果、下記のような状態になりました。
・PHP以外のファイル … 変化無し。期待通りのエラーページ表示
・PHPファイル … 「File not found.」ではなく、ブラウザのエラーが発生。
ブラウザのエラーは、chromeの場合下記画像のような表示になります。
また、アドバイスいただいた通り、コンソールからcurlでアクセスしてみた場合は、期待通りのページのソースが返ってきました。
SSH
1$ curl http://127.0.0.1/nofile.php 2<!doctype html> 3<html lang="ja"> 4<head> 5<meta charset="utf-8"> 6<meta name="robots" content="noindex,nofollow"> 7<title>404</title> 8</head> 9: 10: 11</html>
これは外部の別のサーバーからIPを指定して実行しても同じで、なおかつ外部サーバーから、例えばPHPの下記のようなスクリプトを叩いてみても、期待する404ページHTMLが出力される状態です。
PHP
1<?php 2$context = stream_context_create(array( 3 'http' => array('ignore_errors' => true) 4 )); 5 6$url = "http://hoge.jp/nofile.php"; 7echo file_get_contents($url, false, $context);
この時のレスポンスヘッダは以下でした。
HTTP/1.1 404 Not Found Date: Thu, 25 Feb 2016 08:35:23 GMT Server: Apache Last-Modified: Thu, 25 Feb 2016 08:31:54 GMT Accept-Ranges: bytes Content-Length: 1823 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Connection: close Content-Type: text/html; charset=UTF-8
つまり、データの通信上は正しく設定されたものがやり取りされているものの、ブラウザが受信した場合はそれをHTMLページとして表示できていない、という状態なのかなと思います。
なお、iPhone Safariでアクセスすると、エラーページの表示は「RAWデータをデコードできません」というものになりました。
Content-Typeはちゃんとtext/htmlになっているみたいなのですが、どうしてこのような状態になっているのか、色々調べてもわかりませんでした。
何か問題点があるか、どなたかおわかりになりませんでしょうか。
よろしくお願いいたします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/23 00:32
2016/02/23 01:14
2016/02/23 08:27
2016/02/23 09:32
2016/02/23 09:46