メインコンテンツに移動

メインナビゲーション

  • ホーム
  • サイトマップ
  • ビデオ
  • ご連絡

パンくず

  • ホーム
  • Object Not Found ページが表示された

Object Not Found ページが表示された

laravel
laravel
routing
apache

ユーザーに指定したURLが存在しない場合、NotFoundHTTPExceptionがスローされる。Laravel5の初期設定では、このエラーの詳細を表示します。本番では、このエラーを表示させるわけにはいかず、エラーをキャッチして、ログ(またはDB)に保存、「ページが見つからない」メッセージを返すのは一般的となります。

NotFoundHTTPExceptionをキャッチするテストを繰り返しているときに、突然「Object Not Found」ページが表示され、Webリクエストがlaravel5のフレームワークに到達してなく、Webサーバー(Apache)から発生してしまいました。一体なぜこのような状態なったか、どのように対処したほうがいいかを調査しました。

Object Not Found ページが表示された原因

  • 開発環境でlarave5フレームワークの上でWebアプリを構築しています。複数のWebアプリを同時に見る必要があるため、Webサーバー(Apache)のDocumentRootが直接laravel5の「public」に指定していなかったです。
    • 開発環境のディレクトリ: ~\PHP_SOURCE
    • laravel5フレームワークのディレクトリ: ~\PHP_SOURCE\laravel5\
    • Webサーバー: Apache2.4 DocumentRoot: ~\PHP_SOURCE
    • Webアプリの実行URL(例:laravelのWelcomeページの表示): http://localhost/laravel5/public
  • Routeに定義していないパス(例:http://localhost/laravel5/public/user)を入力すると、NotFoundHTTPExceptionがスローされ、laravel5のエラー詳細ページが表示されます
  • テストを別の入力パタンを変えて、URL最後にスラッシュ(http://localhost/laravel5/public/user/)を入れると、なんと「Object Not Found」ページが表示されました
    • laravel5にデバッガーでどこでこのページを表示させたかを究明したいですが、Webリクエストがlaravel5フレームワークにも来ていないことがわかりました。
    • 入力されたURLも書き換えられました: http://localhost/laravel5/public/user/ ⇒ http://localhost/user (「laravel5/public」が消されました)
    • これは、ApacheのRewirteRuleに書き換えらたことでこの現象になったことを突き止めました
    • laravelがRESTfullを実装するために、URLのRewriteRuleを設定していました: \laravel5\public\.htaccess
      #Redirect Trailing Slashes...
      RewriteRule ^(.*)/$ /$1 [L,R=301]
      
      • これは、最後にスラッシュがあった場合、スラッシュを削除するとともに、ルート(laravel5/public)までに削除してしまいました。

 

Object Not Foundページを表示させない方法

  • WebサーバーのDocumentRootをlaravle5の「public」に設定します(ApacheがURLを書き直すときに、publicディレクトリをなくす必要がなくなる)
    • 上記ディレクトリ(上記の例): ~\PHP_SOURCE\laravel5\public
    • laravel5の起動URL(上記の例): http://localhost/
  • ApacheのRewriteRuleをアプリ公開ディレクトリ(/laravel5/public)を含めるように書き直す
    #Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /laravel5/public/$1 [L,R=301]
    • RESTfullの規約ではURLの最後にスラッシュがあったときにエラー404(Object Not Found)が表示されます。
    • とりあえず、すべてのエラーをキャッチしたい場合、この書き換えルールを除外して、エラー処理はlaravel5にお任せをします。
ホーム

古松

検索

Article Category

  • apache(7)
  • css(19)
  • drupal(295)
  • Electron(4)
  • html(34)
  • javascript(27)
  • laravel(4)
  • linux(5)
  • macOS(2)
  • mysql(13)
  • php(19)
  • python(4)
  • SEO(12)
  • video(72)
  • Visual Studio Code(4)
  • windows(13)
  • wordpress(32)