Twinkle

ルーティングの仕組みの基礎

毎度の「そもそもやろうとしてること自体が間違ってる質問」
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のルーティングはこの振り分け方法を書いている。
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]
  1. リクエストの調査はフレームワークの仕事なので詳細は知らなくてもいい。
  2. 振り分けもフレームワークの仕事。

結局ユーザー側でやることはウェブサーバーの設定とルーティングを書くだけ。
フレームワークを使う段階では詳しいことを知らなくても使える。
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が消えて現代のルーティングになる。

フレームワークはもっと複雑なことしてるだろうけど基本的な仕組みは同じ。