Как WordPress создает URL-адреса, о которых знает Apache?

17

Когда вы создаете страницу в WordPress, это просто запись в таблице базы данных; в этом месте нет актуального файла. Однако я могу создать файл в этом месте сам, и он украдет страницу от WordPress. Я удаляю файл, и он без проблем возвращается на страницу WordPress.

Мне просто интересно, как это достигается. Предположительно некоторая связь происходит между WordPress и Apache (?).

Matt
источник

Ответы:

27

На самом деле не происходит связи между Apache и WordPress. «Волшебство» происходит в mod_rewriteправилах Apache .

Для стандартной установки 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] здесь мы говорим Apache о внутреннем перенаправлении любого URL-запроса /index.php.

Если: эта строка:RewriteCond %{REQUEST_FILENAME} !-fстановится ложной. Это означает, что, добавив этоRewriteCondк вышесказанномуRewriteRule, мы сообщаем Apache отправлять все запросы/index.php, но не в том случае, если это существующий файл .

Также, когда эта строка:RewriteCond %{REQUEST_FILENAME} !-dстановится ложной. Это означает, что, добавив этоRewriteCondк вышесказанномуRewriteRule, мы сообщаем Apache отправлять все запросы/index.php, но не в том случае, если это существующий каталог .

Итак, в конце концов, если это не существующий файл или существующий каталог, Apache внутренне отправляет все остальные запросы /index.php.

Итак, как вы видите, между Apache и WordPress не происходит никакой связи. Apache решает сам все и мы говорим это , чтобы сделать это , используя RewriteRuleи RewriteCondдирективы.

Подробнее о mod_rewriteЗДЕСЬ .

Fayaz
источник
3
Это круто. Я прекрасно понимаю. Я много раз просматривал файл .htaccess по умолчанию и никогда не удосужился проанализировать его. Спасибо!
Мэтт
Это шаблон проектирования, называемый фронт-контроллер. Обратите внимание, что он перенаправляет все несуществующие URL-адреса в index.php, это означает, что если вы введете полный путь к файлу functions.php, frontcontroller не будет работать, и веб-сайт будет обслуживать functions.php. Вот почему вы часто будете видеть, как плагин WordPress и файлы тем начинаются сif ( !defined(‘ABSPATH’)) exit;
Sjors Ottjes
Да, я видел это в плагинах, но не понял его назначение. Таким образом, если !defined(‘ABSPATH’)значение равно true, это означает, что что-то кроме WordPress пытается получить доступ к скрипту (потому что ABSPATH определен в wp-config.php), и поэтому он должен игнорировать этот запрос. Это верно?
Мэтт
@matt Это правильно. Хотя я бы не сказал, что «что-то кроме WordPress». Потому что вы можете определить ABSPATHлюбой другой скрипт PHP, поэтому он разрешит другие скрипты на вашем собственном сервере. Чего он не допустит, так это прямого доступа к этому файлу извне вашего сервера (скажем, из браузера). Поскольку доступ к этому файлу напрямую, пользователи никоим образом не могут определить ABSPATH.
Фаяз
Это действительно приятно знать. Я постоянно беспокоюсь о безопасности, и я смогу воспользоваться этим сразу. Спасибо!
Мэтт