これらのエラー (404、500、...) をどのように処理するかを決めるのに苦労しました。最終的に決定したとき、問題が発生しています。これは非常に長い質問です。誰かの助けを借りて感謝します!
まず、私がどのようにそれを設定することにしたかを説明させてください。共有の Dreamhost アカウントでホストされているサイトがいくつかあります。私が見たフォルダ構造では、サーバー上の私のものはすべて /home/username の下にあり、たとえば、site1.com の Web ルートは次の場所にあります。
/home/username/site1.com
404 not found、500 などのエラー用の一般的なエラー ハンドラ (php スクリプト) を作成しています。
/home/username/error_handler/index.php次のようなものを含む /home/username/.htaccess で .htaccess ファイルを使用できるようにします。
ErrorDocument 404 /error_handler/index.php ErrorDocument 500 /error_handler/index.php
...などなど
これらのエラーが自分のサイトのいずれかで発生した場合に、
/home/username/error_handler/index.phpこれは私が理解するのに苦労している問題です。上記の ErrorDocument ディレクティブは、実際に Apache に
/home/username/site1.com/error_handler/index.php
とにかく、エラーは私のエラー処理phpスクリプトにリダイレクトされるべきです。スクリプトは $_SERVER['REDIRECT_STATUS'] を使用してエラー コードを取得し、次に $_SERVER['REDIRECT_URL'] と $_SERVER['HTTP_HOST'] を使用して何をすべきかを決定します。そのサイトに固有のエラー ハンドラーが存在するかどうかを確認します (例: site1.com/errors/404.php)。このカスタム ページが存在しない場合は、もう少しユーザー フレンドリでスタイルの整った一般的なメッセージが出力され、エラーによっては私の連絡先情報が含まれる場合があります。
このようにすることで、これらすべてのエラーをこの 1 つの php スクリプトに流し込むことができます。好きなようにエラーをログに記録したり、必要に応じて電子メール通知を送信したりできます。また、ErrorDocument Apache ディレクティブをすべてのサイトに対して設定するのではなく、すべてのサイトに対して 1 回設定することもできます。また、技術的に言えば、サイトのルートが実際には Web ルートにない場合に、フォルダー構造をスキャンしてサイトのルートがどこにあるかを把握するシステムを既に持っているため、サイトを移動しても変更なしで引き続き機能します。これは、すべての 404 問題に mod_rewrite を使用するような他のソリューションでは不可能かもしれませんが、これはよくあることです。または、可能であるとしても、それを行うのは非常に難しいかもしれません。さらに、私はすでにその作業を行っているので、適応するのは簡単です.
ドメイン名をまだ持っていないサイト (またはドメイン名が現在既に使用されているサイト) で作業している場合、たとえば site1.com/dev/site3.com に一時的に保存します。サイトを site3.com に移動すると、サイトごとに htaccess ファイルがある場合は、最終的にそれらを更新する必要が生じます。ドメイン名を変更しても同じです。
例: site1.com/dev/site3.com に保存されているサイトの htaccess ファイルには次のように記述されています。
ErrorDocument 404 /site1.com/dev/site3.com/error/404.php
そして、これを次のように変更する必要があります。
ErrorDocument 404 /site3.com/error/404.php
明らかに、これは膨大な量の作業ではありませんが、私はすでに多くのサイトを管理しており、おそらく毎年さらに多くのサイトを作成しており、その 95% は共有の DreamHost アカウントでホストされています. そして、それらのほとんどは、少なくとも 1 回移動します。したがって、自動設定を行うことで、長期的にはいくらかの労力を節約できます。
すべてのサイトでサイト相対リンクを管理するためのシステムを既にセットアップしています。これらのリンクは、サイトが既存のサイトのサブディレクトリに存在する場合でも、独自のドメインに存在する場合でも機能します。また、Web ルートの場所が異なっていても、ローカルの開発サーバーで変更することなく動作します。たとえば、ライブ サーバーでは、サイト相対の http リンク /img/1.jpg はファイル /home/username/site1.com/img/1.jpg に解決されますが、ローカル開発サーバーでは C に解決されます。 :\xampp\htdocs\img\1.jpg、論理サイト ルートが C:\xampp\htdocs\site1.com にあると私が考えているにもかかわらず。私はこのシステムが大好きで、使用したファイル構造に基づいて、期待どおりに自動的に機能するものをセットアップするというアイデアを思いつきました。
それで、それを機能させることができれば、これはかなり良いシステムだと思います。しかし、私はまだApacheの構成、mod_rewriteなどに非常に慣れていません。これを行うためのはるかに簡単で優れた方法がある可能性があります。あなたが知っているなら、私に知らせてください。
とにかく、それはさておき、私はそれを機能させることができません。最も簡単な方法は、ErrorDocument ディレクティブで Web ルートの上のフォルダーに要求を送信できるようにすることです。ただし、パスはドキュメント ルートからの相対 URL パスです。/home/username/.htaccess で以下を使用して、
ErrorDocument 404 /error_handler/index.php
存在しないリソースへのリクエストにより、Apache は次の場所でファイルを探します。
site1.com/error_handler/index.php
そのため、これらの URL を /home/username/error_handler にリダイレクトするリダイレクトを (すべてのサイトで) 設定する必要があると考えました。いくつか試してみましたが、どれも機能しませんでした。
エイリアスは最も単純なソリューションのように見えましたが、サーバーの実行時に設定する必要があるものです (それが正しい用語であるかどうかはわかりません - サーバーの起動時)。私のローカルサーバーでは、次を使用して正常に機能しました。
エイリアス /error_handler C:\xampp\htdocs\error_handler2
Alias が適切に機能していることをテストするために、ローカル フォルダーを変更しました。(ローカル サーバーでは、ErrorDocument ディレクティブで指定された URL パスは実際には正しいフォルダーを指しています。これは、私のローカル サーバーでは Web ルートが技術的には C:\xampp\htdocs であり、使用するエラー ハンドラーが保存されているためです)ローカルでは C:\xampp\htdocs\error_handler\index.php)
Dreamhost には、私が推測しているものをエイリアスとして作成できる Web クライアントがあります。site1.com の error_handler フォルダーを /home/username/error_handler にリダイレクトしようとしたときに、ブラウザーに site1.com/error_handler と入力すると正しく動作するように見えます。しかし、site1.com/test1234 (存在しない) と入力すると、エラー ハンドラを使用しようとして 404 エラーが発生したと表示されます。また、Web クライアントからログインしてポイント アンド クリックする必要があり (そして、サーバーが再起動するまで数分待つ必要があります)、新しいサイト用にこれをセットアップするたびに、それを機能させることができたとしても.
そこで、最も柔軟なソリューションと思われる mod_rewrite で動作するようにしました。私の最初の試みは次のようなものでした (現在は /home/username/site1.com/.htaccess に保存されていますが、最終的には /home/username/.htaccess に保存されます)。
RewriteEngine オン RewriteRule ^error_handler/index.php$ /home/username/error_handler/index.php
私が上でやろうとしていたことの平易な英語版は、私のサイトのいずれかで error_handler/index.php のリクエストを /home/username/error_handler/index.php に送信することです。私が持っていた誤解は、置換が存在する場合、ファイルパスとして扱われるということです。しかし、ドキュメントに「(または、.htaccess ファイルで書き換えを使用する場合は、ドキュメント ルートに相対的に)」と記載されていることを見逃していました。したがって、/home/username/error_handler/index.php に書き換える代わりに、実際には /home/username/site1.com/home/username/error_handler/index.php に書き換えようとしています。
Options +FollowSymLinks を含めてみました。これは、Apache のドキュメントに次のように記載されているためです。
このコンテキストで書き換えエンジンを有効にするには [htaccess でのディレクトリごとの書き換え]、"RewriteEngine On" を設定し、"Options FollowSymLinks" を有効にする必要があります。管理者がユーザーのディレクトリの FollowSymLinks の上書きを無効にしている場合、書き換えエンジンを使用することはできません。この制限は、セキュリティ上の理由から必要です。
しばらく検索しましたが、Dreamhost がこれをどのように処理するかについては何も見つかりませんでした (おそらくどこを見ればよいかわからなかったからです)。
Apache のドキュメントに次のように書かれているため、RewriteBase を試してみました。
「このディレクティブは、次の条件のいずれかに該当しない限り、ディレクトリごと (htaccess) コンテキストでの置換で相対パスを使用する場合に必要です。
元のリクエストと置換は、DocumentRoot の下にあります (エイリアスなどの他の手段で到達できるのとは対照的に)。"
これは URL パスであるはずなので、私の場合は RewriteBase / にする必要があります。リダイレクトはすべて site1.com/error_handler から行われるからです。Rewrite Base /home/username と RewriteRule ^error_handler/index.php$ error_handler/index.php も試しました。ただし、書き換えベースは、ドキュメント ルートからの相対 URL パスです。そのため、エイリアスのようなものを使用する必要があります。上記のドキュメントからの引用の意味は、mod_rewrite を使用して Web ルートの上にコンテンツを送信できるということです。私が知らない多くのことの 1 つは、Alias 以外の「その他の手段」が何であるかということです。Alias は Dreamhost のオプションではない可能性があると思います。少なくとも私には理解できませんでした。