PHP

【PHP】WordPressで学ぶ「URLの仕組み」

この記事では、WordPressを例にしてURLからPHPが実行される仕組みを解説します。

WordPressで作られたWebサイトのURLを気にして見たことはありますでしょうか?
例えばこの記事だと以下のようなURLになっています。

https://kyo-blog.com/wordpress-url-mechanism/

後半の赤字部分がこの記事に紐付いている部分ですが、この部分は設定によって自由に変えることができます。

こういった任意のURLから、どのような仕組みで実際のPHPソースを呼び出して実行しているのか、という内容をザックリ解説したいと思います。

具体的には、.htaccessによるRewriteのお話です。

PHPが実行される仕組み

まずはPHPの基本のお話ですが、サーバー上に設置されたPHPファイルがURLアクセスによってどのように実行されるのかという点をおさらいします。

サーバーには「公開ディレクトリ」というものがあり、通常はここにPHPファイルを設置しますね。

例として、下記のwwwが公開ディレクトリとします。

/home/username/www/index.php
/home/username/www/test.php

そこに「index.php」「test.php」という2ファイルが設置されているとしましょう。

この場合、

https://kyo-blog.com/

にアクセスするとindex.phpが実行され、

https://kyo-blog.com/test.php

にアクセスすると、test.phpが実行されます。

「index.php」は、ファイル名の指定がなかった場合にデフォルトで実行されるファイルになります。

これが基本です。

WordPressのURL

ではWordPressのURLがどうなっているかというと、設定の「パーマリンク設定」によって可変になります。
パーマリンク設定とは、記事をどのようなURLで表示するかという、サイト全体の設定です。

https://kyo-blog.com/?p=123
https://kyo-blog.com/2019/08/20/sample-post/
https://kyo-blog.com/sample-post/

例として上記のようなURLになりますが、これらはすべて同じ記事を表示します。

でも公開ディレクトリには「2019」や「sample-post」なんていうディレクトリもファイルもありませんよね。

おそらくここがPHPを始めたばかりの初心者が

?????

となり、つまずく部分かと思います。

その答えを、次項以降で解説します。

.htaccessによるRewrite(リライト)

なぜファイルが存在しないURLでPHPが実行されるかというと、.htaccessによるRewrite(リライト)を行っているからです。

順を追って説明します。

.htaccessとはファイル名です。公開ディレクトリに設置し、サーバーやPHPに関する設定を記述することができます。
.htaccessに記述した設定は、設置したディレクトリ以下に適用されます。(サブディレクトリがあった場合はそこも含む)

そして.htaccessに記述することができる設定の一つに、Rewrite(リライト)というものがあります。

Rewriteは、あるURLにアクセスがあったら特定のファイルを読み込むという動作であったり、別のURLに転送するという動作を設定することができます。

この記事で解説するのは、前者の動作です。

ちなみに後者のURL転送でよく使われるのは、

  • httpへのアクセスを強制的にhttpsに転送する
  • サイトのURLが変わって旧URLから新URLへ転送する

といった動作です。これらもRewriteを使って設定することが多いです。

話を戻して、「あるURLにアクセスがあったら特定のファイルを読み込む」という動作ですが、具体的には.htaccessの以下の部分になります。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
 

記述の細かい意味はここでは解説しませんが、とてもざっくり説明すると、「実在するファイルまたはディレクトリ以外へのアクセスは全部index.phpを実行してね」という命令になります。

つまり、.htaccessと同階層のURL以下にアクセスがあった場合、ファイルやディレクトリが存在しなければ、どんなURLでも必ず最初にindex.phpが実行されるということです。

逆にファイルやディレクトリが存在する場合というのは、

  • jsファイル
  • cssファイル
  • 画像ファイル

などです。これらは実在のファイルを読み込む必要があるため、index.phpにRewriteするルールからは除外されます。

.htaccessのように先頭に.(ドット)が付くファイルはLinux上では隠しファイル扱いになります。FTPソフトで見る場合、設定によっては表示されない場合があるので、その場合は「隠しファイルを表示」等の設定を確認してみましょう。

中身は普通のテキストファイルですので、テキストエディタで開くことができます。

Rewrite後の処理の流れ

URLからPHPを実行する仕組みは以上になりますが、index.phpの先で行っている処理についても、少しだけ解説します。

必ず最初にindex.phpが実行されるのは分かったけど、じゃあそこから一体どうやって記事を表示しているの?という話です。

index.php自体は別のPHPソースを読み込むだけの単純な処理になっていますが、その先ではWordPressのコアとなるソースが大量に読み込まれていきます。

中では非常に複雑な処理が行われるのですが、ざっくり流れだけ書くと、以下のように感じです。

  1. アクセスされたURLを分解する
  2. 分解したURLを、パーマリンクの設定に合わせたパラメータに変換する
  3. 上記パラメータを元にDBから記事を取得する
  4. 取得した記事を表示(出力)する

これだけ書くと簡単に見えるかもしれませんが、WordPressは非常に多くの機能を有しているので、実際のところはかなり複雑です。

例えば、パーマリンクの設定がどうなっているかによってDBの見るべき場所を変えなければなりませんし、サイトを構成しているページは記事だけではありません。

  • 固定ページ
  • カテゴリー
  • アーカイブ
  • 検索
  • ページャ

など、記事以外のページもたくさんあるので、これらの内のどのページを表示させたいのか?というのも含めて、URLから判断する必要があります。

ちなみに、WordPressでは「テーマ」を変えることによって見た目をガラリと変えることができますが、上記の流れで言うと「テーマ」が行うのは4の表示部分だけです。
なので、WordPressの中身をそれほど理解しなくても、色々な人がテーマを作ることができ、コアな処理を変えずに見た目だけを変更できる訳です。

まとめ

URLの仕組み

  • 可変URLからPHPを実行できるのは、.htaccessによるRewriteを行っているから
  • Rewrite後はURLを分解してDBから記事を表示している

今回はWordPressを例にとって解説しましたが、実はLalavelCakePHPなど、MVCモデルのPHPフレームワークでも、Rewriteでindex.phpを処理の入り口にする部分は、大体同じような仕組みになっています。

まあ、WordPressやフレームワークを使う分には、ほとんど気にしなくてもいい部分ではあるのですが、もしコア部分のソースを解析する必要が生じたとき、最初に実行されるソースが分からなければ、.htaccessにその答えがあるかもしれません。