Як WordPress створює URL-адреси, про які знає Apache?


17

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

Мені просто цікаво, як цього досягти. Імовірно, деяке спілкування відбувається між WordPress та Apache (?).

Відповіді:


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ТУТ читайте .


3
Це чудово. Я чудово розумію. Я багато разів переглядав файл .htaccess за замовчуванням і ніколи не намагався його аналізувати. Дякую!
Метт

Це конструкція, що називається передній контролер. Зауважте, що він перенаправляє всі неіснуючі URL-адреси на index.php, це означає, що якщо ви введете повний шлях до файлу function.php, фронтальний контролер не працюватиме, а веб-сайт обслуговуватиме function.php. Ось чому ви часто бачите плагін WordPress і файли тем, починаючи зif ( !defined(‘ABSPATH’)) exit;
Sjors Ottjes

Так, я бачив це в плагінах, але не зрозумів його призначення. Отже, якщо !defined(‘ABSPATH’)оцінюється як істинне, це означає, що щось, крім WordPress, намагається отримати доступ до скрипту (оскільки ABSPATH визначений у wp-config.php), і тому він повинен ігнорувати цей запит. Це правильно?
Метт

@matt Це правильно. Хоча я б не сказав, що "щось інше, ніж WordPress". Оскільки ви також можете визначити ABSPATHбудь-який інший скрипт PHP, це дозволить отримати інші сценарії на вашому власному сервері. Що забороняється - це прямий доступ до цього файлу поза вашого сервера (скажімо, з браузера). Тому що, отримуючи прямий доступ до цього файлу, користувачі ніяк не можуть визначитись ABSPATH.
Фаяз

Це дійсно чудово знати. Я постійно переживаю за безпеку, і я зможу скористатися цим негайно. Дякую!
Метт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.