序文
メールで「さくらの共有サーバで404ページが上手く作動しない」てな質問をいただき、改めて自分の書いたページを読み直すと全くまとまっていない事に愕然(^_^;
と云うか、書いた当時は私も良く解っていなかった。
色々解ってきた今、しっかりまとめ直したページを作成する事に。
サイト内関連ページ
- さくらのレンタルサーバで404ページが上手く作れない:その1
- さくらのレンタルサーバで404ページが上手く作れない:その2
- さくらのレンタルサーバで404ページが上手く作れない:その3
- さくらのスタンダードで404/403/503ページ作成
- さくらのスタンダードで404ページを作成(最終版)(このページ)
私の中でもようやくスッキリとした回答が出た感じ。
3年越しで一区切り付きました(^_^;
404ページの作り方は、以下でイケると思います。
こんな場合に必要
- さくらのスタンダード/ライトを利用している
- マルチドメインを利用し、一部のディレクトリを別ドメインで運営している
- php-cgiを利用して、htmlをphp化している。
またはphpを利用している
さくらのスタンダードで404ページを作成する方法
注意点
1. IE9では正常に作動しないかもしれません(原因:謎。のんびり調査中)
2. 他のリダイレクトと同時に利用する場合、無限ループに注意してください
ドメインの構成例
ユーザー名.sakura.ne.jp/
│
├aaaa.com
└bbbb.com
サーバーの構成例
/home/XXXX/www/ ・・・ルート(XXXX.sakura.ne.jp)
/home/XXXX/www/aaaa ・・・・マルチドメイン(aaaa.com)
/home/XXXX/www/bbbb ・・・・マルチドメイン(bbbb.com)
上記のような構成になっていると仮定して話を進めます。
まずは404ページを設置
/home/XXXX/www/
/home/XXXX/www/aaaa
/home/XXXX/www/bbbb
上記のディレクトリ(3つ)全てに404.html を設置します。
/home/XXXX/www/ccc
/home/XXXX/www/aaaa/dddd
などの下層ディレクトリには404.htmlは不要です。
以下、
aaaa.com と bbbb.com のみを「htmlをphpとして作動させる設定」を施している場合の記述例 です。
htaccessの記述(ルート)
/home/XXXX/www/ のhtaccessには、
ErrorDocument 404 /404.html
を記述する。これだけで404ページは作動する。
マルチドメイン側も、ルートの404設定が反映されます。
ErrorDocument 403 /403.htmlてな具合にErrorDocument 404は後ろに記述すること。
ErrorDocument 503 /503.html
ErrorDocument 404 /404.html
ErrorDocument 404が、503や403より先に設置してあると、何故かエラーが出ます。
htaccessの記述(マルチドメイン側)
/home/XXXX/www/aaaa/home/XXXX/www/bbbb
のhtaccessの記述は、以下のようにする
DirectoryIndex index.html index.php .ht
Action myphp-script /php.cgi
AddHandler myphp-script .php .html
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} "\.(php|html)$"
RewriteRule .+ /404.html [L]
ルートのhtaccessに「ErrorDocument 404 /404.html」が記載してあれば、
マルチドメイン側にもその設定は反映されます。
ただし、phpとして作動するページは、これだけだとエラーが出てしまいます。
なので、マルチドメイン側で「存在しないphpファイルにアクセスがあった場合」のみ、
強制的に404ページへリダイレクトをかけます。
注意1
マルチドメイン側のhtaccessに
「RewriteBase /」の記述がないと、サーバーのルートまで404ページを取りに行きます。
ドメインをまたがってしまうので、上手く作動しない場合があります。
注意点2
この方法(RewriteRuleでの強制書き換え)で404ページに飛んだ場合、ステータスコードは404ではなく200になってしまいます。
(さくらのスタンダードはApache1.3系なのでRewriteRuleではステータスコードを404に変更できない。Apache2.2以降ならステータスコードも404に変更可能)
SEO的な心配があるかもしれませんが、その辺は大丈夫かと思います。
404ページのステータスコードが200でも、Googleはキチンと認識してくれます。
ウチのサイトはこの設定で2年間運営していますが、Googleウェブマスターツール上におかしなインデックス済みページやリンク切れ報告、ソフト404の警告などは出て来ません。
このサイトの検索エンジンでの評価もそんなに悪くないので、ペナルティ発生とかの心配も無いかと思います。
(恐らくですが)この方法で検索エンジンも十分理解してくれていると思います。
注意点3
この方法を試す際、上手く行かず何度かやり直す場合があるかと思います。
「404ページが上手く作動せずhtaccessを書き直す」場合は、
ブラウザのキャッシュも必ず削除して下さい。キャッシュが残っているとhtaccessを修正しても正常に作動しません。
注意点4
初歩の初歩ですが、改行コードもチェックしましょう。
改行コードLFにしないと作動しません(Windowsの改行コードはCR+LF)
またhtaccessの最後の行にも改行コードが必要です。
あとがき(というかto do リスト)
- 最近「IE9で404ページの表示がおかしいな~」という現象を発見。なんとか解消したいけど方法が見つからない
- 今年6月、「PHPの脆弱性をついた不正アクセスの可能性について」と云うことでphp-cgiをコピーして利用しているユーザーはphp-cgiの更新を余儀なくされた。
- このサイトもphp-cgiの修正を行ったのだが、それ以降一部のphpファイルが正常に作動しなくなってしまった。。。
- 別に動かなくなっても問題のないプログラムなので放置したままだけど、これも近いうちに原因を突き止め作動するように修正したい。
2 年ぶりに404ページの設定を確認しなおすと、「あれ?このサイトで紹介した方法が今では通用しなくなっているぞ?」となりかなりアタフタした。当初は「今年6月のphp-cgiを差し替えた辺りで共用サーバの仕様が変わってしまったのか?」と疑い、思いつく限り色々な方法を試したけど、全く効果なし。
原因はウチのPC環境またはIE9だった('Α`)