Twinkle
Twinkle
ルーティングの仕組みの基礎
毎度の「そもそもやろうとしてること自体が間違ってる質問」
https://teratail.com/questions/jyl7cyfq0dcnkv
http://localhost/test.php
の.php
を省略してhttp://localhost/test
で表示したいって質問は多いけど「.php
を省略すればいいはず」という最初の発想が間違っている。
発想が間違ってるからどんなに検索しても間違った答えにしか辿り着けない。
Laravelなどのフレームワークでは当たり前のように.php
が見えないけど別に省略してる訳ではない。
簡易的な流れの説明
- すべてのリクエストを
http://localhost/index.php
に集める。 - index.phpの中でどんなリクエストが来てるか調べる。
http://localhost/test
なら/test
へのリクエストが来てると判断。 - リクエスト情報を元に処理を振り分ける。
Laravelのルーティングはこの振り分け方法を書いている。
Route::get('test', TestController::class);
それぞれの実現方法
index.php
に集めるのはウェブサーバーの仕事。
nginxなら
location / {
try_files $uri $uri/ /index.php?$query_string;
}
Apacheなら.htaccess
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
- リクエストの調査はフレームワークの仕事なので詳細は知らなくてもいい。
- 振り分けもフレームワークの仕事。
結局ユーザー側でやることはウェブサーバーの設定とルーティングを書くだけ。
フレームワークを使う段階では詳しいことを知らなくても使える。
index.php
に集めれば後はフレームワークが上手くやってくれるとだけ理解すれば十分。
.php
を省略してる訳ではない説明終了。
フレームワーク普及前の時代
200X年頃はリクエストの調査も自分でコードを書いていた。
http://localhost/index.php/test
へのリクエストに対して/test
を取り出して振り分け。
リクエストの内容は$_SERVER
変数で取得できるので$_SERVER['PATH_INFO']
や$_SERVER['REQUEST_URI']
を使用。
http://localhost/index.php/test
の段階からもう少し進んでindex.php
に集めるウェブサーバーを合わせると/index.php
が消えて現代のルーティングになる。
フレームワークはもっと複雑なことしてるだろうけど基本的な仕組みは同じ。