📕

Laravelのルーティングの正体

2024/08/27に公開

まえがき

Laravelでアプリケーションを作るなら、誰しもルーティングを利用していると思います。
URLによって画面遷移したり、JSONを取得したり。なくてはならない存在ですね。

でも皆さんブラウザでLaravelサイトのURLにアクセスした時、どのファイルを読み込んでるか知ってます?

入門書やプログラミングスクールでは教えてくれない、真相を見ていきましょう。

実はずっと同じphpファイルにアクセスしている。

「はあ?それぞれのbladeファイルをみてるんだろ!?」
って思ったアナタ。
まあ、半分正解です。
でも直接そこにアクセスしているわけではありません。

Laravelでは必ず{プロジェクトルート}/public/index.phpを起点として、ずっとindex.phpにアクセスしています。
違うPHPにアクセスしているように見えるのは、index.phpがルーティングファイルやアクションコントローラを通してblade.phpをインクルードしているからです。

そうやって公開フォルダにあるindex.phpを閲覧しているから、非公開フォルダにあるbladeの内容を見ることができるわけです。

アクセスしてきたURLを解析しているのはWEBサーバではなくアプリケーションサーバってことになります。

Laravelアプリケーションをサーバにデプロイした経験がある人の中には、環境構築してもindex.phpしか表示できず、うまくルーティングできない現象にハマった事はないでしょうか?
それはこれが原因です。

では具体的にどこに書いているかというと{プロジェクトルート}/public/.htaccessです。

.htaccess

.htaccessの中にはこんな記述がありますね。

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

これは、リクエストしてきたURLと一致するディレクトリやファイルがあればそれを直接表示し、それ以外のURLでアクセスしてきたら全部index.phpにアクセスした事にしろ、というリダイレクトの設定が書かれています。

.htaccessはしばしば複数人で開発中に競合する設定を書くことがあるため、gitignoreする運用があります。その状態でデプロイして、.htaccessの配置を忘れたり、上記の記述を書き忘れるとindex.phpしか映らないなんてことになりますね。

そういうわけで、publicフォルダ内に、landing.htmlとか、Laravelが必要ない簡単なページを配置しておいて、そのファイル名でリンク貼ったらルーティングファイル通さずに表示されます。

おわりに

今回はLaravelの本質について勉強しました。
知らなくてもなんとなく動くので気にしなかったと思いますが、これを知るとまた見える世界が変わったと思います。
他のフレームワークでも役に立つと思いますので気が向いたら調べてみてください。

以上。

株式会社ONE WEDGE

【Serverlessで世の中をもっと楽しく】 ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
https://onewedge.co.jp

Discussion