W jaki sposób WordPress tworzy adresy URL, o których wie Apache?

17

Kiedy tworzysz stronę w WordPress, jest to tylko wpis w tabeli bazy danych; w tej lokalizacji nie ma rzeczywistego pliku. Jednak mogę sam utworzyć plik w tej lokalizacji, co spowoduje wykroczenie strony z WordPress. Usuwam plik i płynnie wraca do strony WordPress.

Jestem tylko ciekawy, jak to osiągnąć. Prawdopodobnie odbywa się komunikacja między WordPress a Apache (?).

Matt
źródło

Odpowiedzi:

27

W rzeczywistości nie ma komunikacji między Apache a WordPress. „Magia” dzieje się w mod_rewriteregułach Apache .

W przypadku standardowej instalacji WordPress obowiązują następujące zasady .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

Zwróć uwagę na ten wiersz: RewriteRule . /index.php [L] tutaj mówimy Apache, aby wewnętrznie przekierowywał każde żądanie adresu URL /index.php.

Chyba że: ta linia:RewriteCond %{REQUEST_FILENAME} !-fstaje się fałszywa. Oznacza to, że dodając toRewriteConddo powyższegoRewriteRule, mówimy Apache, aby wysłał wszystkie żądania/index.php, ale nie, jeśli jest to istniejący plik .

Również, gdy ta linia:RewriteCond %{REQUEST_FILENAME} !-dstaje się fałszem. Oznacza to, że dodając toRewriteConddo powyższegoRewriteRule, mówimy Apache, aby wysłał wszystkie żądania do/index.php, ale nie, jeśli jest to istniejący katalog .

Tak więc ostatecznie, chyba że jest to istniejący plik lub katalog, Apache wewnętrznie wysyła wszystkie pozostałe żądania do /index.php.

Jak widać, nie ma komunikacji między Apache i WordPress. Apache sam decyduje o wszystkim, a my mówimy mu, żeby to robił, używając dyrektyw RewriteRulei RewriteConddyrektyw.

Przeczytaj więcej o mod_rewriteTUTAJ .

Fajaz
źródło
3
To jest świetne. Świetnie rozumiem. Wielokrotnie przeglądałem domyślny plik .htaccess i nigdy nie zadałem sobie trudu, aby go przeanalizować. Dziękuję Ci!
Matt
Jest to wzorzec projektowy zwany kontrolerem przednim. Zauważ, że przekierowuje wszystkie nieistniejące adresy URL do index.php, oznacza to, że jeśli wpiszesz pełną ścieżkę do pliku functions.php, frontcontroller nie będzie działał, a strona internetowa będzie obsługiwać functions.php. Właśnie dlatego często pojawiają się wtyczki i pliki motywów WordPressif ( !defined(‘ABSPATH’)) exit;
Sjors Ottjes
Tak, widziałem to we wtyczkach, ale nie zrozumiałem jej celu. Tak więc, jeśli zostanie !defined(‘ABSPATH’)ocenione jako prawda, oznacza to, że coś innego niż WordPress próbuje uzyskać dostęp do skryptu (ponieważ ABSPATH jest zdefiniowane w wp-config.php), a zatem powinno zignorować to żądanie. Czy to jest poprawne?
Matt
@matt To prawda. Chociaż nie powiedziałbym, że „coś innego niż WordPress”. Ponieważ możesz zdefiniować również ABSPATHw dowolnym innym skrypcie PHP, więc pozwoli on na inne skrypty na twoim serwerze. To, czego nie pozwoli, to bezpośredni dostęp do tego pliku spoza serwera (powiedzmy z przeglądarki). Ponieważ poprzez bezpośredni dostęp do tego pliku użytkownicy nie są w stanie zdefiniować ABSPATH.
Fayaz
To naprawdę wspaniale wiedzieć. Ciągle martwię się o bezpieczeństwo i będę mógł od razu z tego skorzystać. Dziękuję Ci!
Matt