ルーティングの仕組みの基礎 ==== 毎度の「そもそもやろうとしてること自体が間違ってる質問」 https://teratail.com/questions/jyl7cyfq0dcnkv `http://localhost/test.php`の`.php`を省略して`http://localhost/test`で表示したいって質問は多いけど「`.php`を省略すればいいはず」という最初の発想が間違っている。 発想が間違ってるからどんなに検索しても間違った答えにしか辿り着けない。 Laravelなどのフレームワークでは当たり前のように`.php`が見えないけど別に省略してる訳ではない。 ### 簡易的な流れの説明 1. すべてのリクエストを`http://localhost/index.php`に集める。 2. index.phpの中でどんなリクエストが来てるか調べる。`http://localhost/test`なら`/test`へのリクエストが来てると判断。 3. リクエスト情報を元に処理を振り分ける。 Laravelのルーティングはこの振り分け方法を書いている。 ```php Route::get('test', TestController::class); ``` ### それぞれの実現方法 1. `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] ``` 2. リクエストの調査はフレームワークの仕事なので詳細は知らなくてもいい。 3. 振り分けもフレームワークの仕事。 結局ユーザー側でやることはウェブサーバーの設定とルーティングを書くだけ。 フレームワークを使う段階では詳しいことを知らなくても使える。 `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`が消えて現代のルーティングになる。 フレームワークはもっと複雑なことしてるだろうけど基本的な仕組みは同じ。