Laravelのルーティングの正体
まえがき
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スキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion