ErrorDocumentディレクティブの引数は、文字列、内部URI、または外部URIにすることができます。ここにある「error/404」バリアントは文字列として解釈されるため、Apacheはハードコードされたエラーメッセージであるかのように出力します。これは私たちが今望んでいることではありません。
ここで、スラッシュを前に付けると、「/ error / 404」はローカルリダイレクトになりますが、DocumentRootに対してローカルになります。したがって、http://example.com/testit/.htaccessに.htaccessファイルがあり、 http ://example.com/testit/something.txtをリクエストすると、ドキュメントhttp://example.com/error /404が読み込まれます。これを回避するには、サブディレクトリのパス(/ testit / error / 404)を前に付けるか、DocumentRootを試してみてください。ただし、これはすでにソフトリダイレクトであることに注意してください。ブラウザのアドレスバーにユーザーが入力したURIが表示されるため、ErrorDocumentのURIをきれいにする必要はありません。ただ
ErrorDocument 404 /path-to-my-folder/index.php?page=error-404
完全に良好な動作を提供します。たとえば、見つからないexample.com/something.txtをリクエストすると、アドレスバーには引き続きexample.com/something.txtが表示されますが、index.php?page =エラー-404が提供されます。
ただし、本当にブラウザのアドレスバーに/ error / 404を表示したい場合は、ErrorDocumentに引数として絶対URIを指定します。ErrorDocument 404 http://my-server/my-path/error/404
これにより、ブラウザはそのドキュメントにハードリダイレクトします。リクエストはmod_rewriteルールによってキャプチャされ、index.php?page = error-404のコンテンツが提供されますが、アドレスバーには引き続き/ error/404が表示されます。このメソッドの欠点は、404応答ヘッダーを手動で設定する必要があり、元のリクエストが何であったかがわからないことです。また、ロボットを混乱させる可能性があり、訪問者を混乱させる可能性があります。これは、訪問者が期待する動作ではないためです。
私のアドバイスは、次のように相対リンクにすることです。
#Rewrite options
RewriteEngine On # Turn on the rewriting engine
#Other options
ErrorDocument 403 /path-to-my-subfolder/index.php?page=error-403
ErrorDocument 404 /path-to-my-subfolder/index.php?page=error-404
IndexIgnore *
Options All -Indexes