web-dev-qa-db-ja.com

WordPressはApacheが知っているURLをどのように作成しますか?

WordPressでページを作成すると、それはデータベーステーブル内の単なるエントリになります。その場所に実際のファイルはありません。しかし、私はその場所に自分でファイルを作成することができ、それはWordPressからページを盗みます。ファイルを削除すると、シームレスにWordPressページに戻ります。

私はこれがどのようにして達成されるかについてただ興味があります。おそらく、WordPressとApacheの間で何らかの通信が行われています(?)。

17
Matt

実際には、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ディレクティブを使用してそれを実行するように指示しています。

mod_rewriteについてはこちらを参照してください

27
Fayaz