WordPressはApacheが知っているURLをどのように作成しますか?
WordPressでページを作成すると、それはデータベーステーブル内の単なるエントリになります。その場所に実際のファイルはありません。しかし、私はその場所に自分でファイルを作成することができ、それはWordPressからページを盗みます。ファイルを削除すると、シームレスにWordPressページに戻ります。
私はこれがどのようにして達成されるかについてただ興味があります。おそらく、WordPressとApacheの間で何らかの通信が行われています(?)。
実際には、ApacheとWordPressの間で通信は行われていません。 「魔法」はApacheのmod_rewrite
のルールで起こっています。
標準のWordPressインストールの場合、.htaccess
には以下の規則があります。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
この行に注意してください。RewriteRule . /index.php [L]
ここでは、URL要求を内部的に/index.php
にリダイレクトするようにApacheに指示しています。
以下を除くこの行:RewriteCond %{REQUEST_FILENAME} !-f
はfalseになります。つまり、このRewriteCond
を上記のRewriteRule
に追加することで、すべての要求を/index.php
に送信するようにApacheに指示していますが、既存のファイルではない場合です。
またwhenこの行:RewriteCond %{REQUEST_FILENAME} !-d
はfalseになります。つまり、このRewriteCond
を上記のRewriteRule
に追加することで、すべての要求を/index.php
に送信するようにApacheに指示していますが、既存のディレクトリではない場合です。
したがって、結局、既存のファイルまたは既存のディレクトリでない限り、Apacheは他のすべての要求を/index.php
に内部的に送信しています。
ご覧のとおり、ApacheとWordPressの間で通信は行われていません。 Apacheは自分自身ですべてを決定しているので、RewriteRule
およびRewriteCond
ディレクティブを使用してそれを実行するように指示しています。