Comment WordPress crée-t-il des URL que Apache connaît?

17

Lorsque vous créez une page dans WordPress, ce n'est qu'une entrée dans une table de base de données; il n'y a pas de fichier réel à cet endroit. Cependant, je peux créer un fichier à cet emplacement moi-même et il volera la page loin de WordPress. Je supprime le fichier et il revient sans problème à la page WordPress.

Je suis simplement curieux de savoir comment cela est réalisé. Vraisemblablement, une communication se produit entre WordPress et Apache (?).

Mat
la source

Réponses:

27

En fait, il n'y a aucune communication entre Apache et WordPress. La "magie" se produit dans les mod_rewriterègles Apache .

Pour une installation WordPress standard, vous avez les règles suivantes dans .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

Remarquez cette ligne: RewriteRule . /index.php [L] ici, nous demandons à Apache de rediriger en interne toute demande d'URL vers /index.php.

Sauf: cette ligne:RewriteCond %{REQUEST_FILENAME} !-fdevient fausse. Cela signifie qu'en ajoutant ceciRewriteCondaveccequi précèdeRewriteRule, nous demandons à Apache d'envoyer toutes les demandes à/index.php, mais pas s'il s'agit d'un fichier existant .

Aussi, lorsque cette ligne:RewriteCond %{REQUEST_FILENAME} !-ddevient fausse. Cela signifie qu'en ajoutant ceciRewriteCondaveccequi précèdeRewriteRule, nous demandons à Apache d'envoyer toutes les requêtes à/index.php, mais pas s'il s'agit d'un répertoire existant .

Donc à la fin, à moins qu'il ne s'agisse d'un fichier ou d'un répertoire existant, Apache envoie en interne toutes les autres demandes à /index.php .

Donc, comme vous le voyez, aucune communication ne se produit entre Apache et WordPress. Apache décide tout lui-même et nous lui disons de le faire en utilisant RewriteRuleetRewriteCond directives .

En savoir plus sur mod_rewriteICI .

Fayaz
la source
3
C'est bien. Je comprends parfaitement. J'ai regardé le fichier .htaccess par défaut plusieurs fois et je n'ai jamais pris la peine de l'analyser. Je vous remercie!
Matt
Il s'agit d'un modèle de conception appelé contrôleur frontal. Notez qu'il redirige toutes les URL non existantes vers index.php, cela signifie que si vous tapez le chemin complet de votre fichier functions.php, le contrôleur frontal ne fonctionnera pas et le site Web servira functions.php. C'est pourquoi vous verrez souvent le plugin WordPress et les fichiers de thème commencer parif ( !defined(‘ABSPATH’)) exit;
Sjors Ottjes
Oui, j'ai vu cela dans des plugins mais je n'ai pas compris son but. Donc, si la valeur est !defined(‘ABSPATH’)true, cela signifie autre chose que WordPress essaie d'accéder au script (car ABSPATH est défini dans wp-config.php), et par conséquent, il doit ignorer cette demande. Est-ce exact?
Matt
@matt C'est exact. Bien que je ne dirais pas que "autre chose que WordPress". Parce que vous pouvez également définir ABSPATHdans n'importe quel autre script PHP, il autorisera donc d'autres scripts sur votre propre serveur. Ce qu'il ne permet pas, c'est l'accès direct à ce fichier depuis l'extérieur de votre serveur (par exemple depuis un navigateur). Parce qu'en accédant directement à ce fichier, les utilisateurs ne sont en aucun cas en mesure de définir ABSPATH.
Fayaz
C'est vraiment super à savoir. Je me soucie constamment de la sécurité et je pourrai en profiter tout de suite. Je vous remercie!
Matt