web-dev-qa-db-fra.com

Configuration de WordPress avec des permaliens personnalisés et aucun fichier .htaccess?

J'ai un client qui préfère fortement désactiver les fichiers .htaccess parce qu'ils aiment définir eux-mêmes les configurations Apache. Cependant, ils veulent toujours des URL conviviales pour le référencement.

Existe-t-il un moyen d'avoir des permaliens personnalisés sans fichier .htaccess? Mes recherches jusqu’à présent semblent indiquer que ce n’est pas possible, mais l’un des développeurs brillants sait peut-être que l’apparence impossible est possible. Merci d'avance!

7
Mike Lee

Bonjour @ Mike Lee :

Pour répondre à votre question, il est utile de comprendre comment tout fonctionne.

Apache sert des URL qui correspondent aux fichiers et aux répertoires

Apache est conçu pour servir les fichiers explicitement identifiés par URL, ou pour servir le index.php trouvé dans un répertoire lorsque le répertoire est explicitement identifié.

Mais Apache peut servir des URL correspondant à mod_rewrite par Regex

Si vous voulez qu'Apache corresponde aux URL pour lesquelles il n'y a pas de vrais répertoires (le cas de WordPress et de jolis permaliens), vous devez avoir un moyen d'indiquer à Apache comment gérer les URL différemment. Et c'est exactement ce que mod_rewrite a été conçu pour permettre; il donne aux administrateurs de serveur la possibilité de définir des règles pour la correspondance des URL à l'aide d'expressions régulières. Ces règles acheminent le résultat vers d'autres URL, comprenant souvent en fait des fichiers .PHP et parfois avec des paramètres d'URL transmis. En fin de compte, les règles spécifient que les fichiers réels sont chargés.

Et mod_rewrite est configuré avec .htaccess ou httpd.conf

Pour configurer mod_rewrite, vous ne pouvez le faire que dans .htaccess ou dans le fichier httpd.conf ou l’un des fichiers qu’il contient, comme potentiellement httpd-vhosts.conf. En fait, je suis surpris que votre client possède les compétences pour contrôler Apache et qu’il ne le sait pas déjà.

WordPress utilise toujours le même fichier .htaccess simple

Passons maintenant à ce que fait WordPress. Lorsque vous définissez des permaliens, WordPress écrit ce qui suit dans le fichier .htaccess, en supposant qu'il soit accessible en écriture (et dans ce premier exemple, en supposant que votre site Web est fourni à la racine):

# 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

Avertissement: lorsque votre répertoire WordPress Front Page n'est pas une racine

Si votre site est plutôt servi à partir de /blog, le fichier .htaccess écrit ressemblera à ceci:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
</IfModule>

Routes WordPress Toutes les URL non correspondantes aux fichiers/répertoires correspondant à index.php

Comme vous pouvez le constater, la seule chose que WordPress utilise pour .htaccess est de mappertouteURL vers le domaine avec /index.php (ou /blog/index.php dans le deuxième exemple)saufquand une URL correspond à un fichier réel (comme une image .jpg/.gif/.png, une feuille de style .css, un script .js, etc.) ou lorsqu'elle correspond à un répertoire réel (qui, autant que je sache, est non pertinent dans une installation standard de WordPress.)

Dans PHP WordPress analyse $_SERVER['REQUEST_URI'] pour décider quoi charger

À l'intérieur de son code PHP, WordPress saisit la valeur de $_SERVER['REQUEST_URI'] qui contient la demande d'URL complète sans le domaine et le schéma (c'est-à-dire que le schéma est http ou https) et il analyse ensuite la valeur pour déterminer l'URL demandée et par conséquent pages qu'il devrait charger.

Contourner .htaccess? Amener Apache à charger des URL virtuelles (mais bonne chance avec ça!)

Donc, si vous voulez contourner d'une manière ou d'une autre .htaccess, votre travail consistera à faire en sorte qu'Apache réponde à une URL arbitraire, puis chargez WordPress et définissez $_SERVER['REQUEST_URI'] sur le chemin de l'URL plus les paramètres; IOW spoofing mais dans le bon sens. Cela dit, je sais que si je ne connais aucun moyen qui ne soit pas trop compliqué de le faire.

Intégration /index.php/ (Peut-être?!?)

Même si * Chris_O * a raison de faire précéder /index.php/ de vos URL, je grince des yeux chaque fois que je le vois. Il ajoute 10 caractères à chaque URL, ce qui les rend plus longues et moins significatives pour les moteurs de recherche, mais pire encore, les rend moins partageables et donne un aspect crypté aux utilisateurs. Désolé Chris, je sais que tu pensais bien, mais (hum!} _

Créer de vrais répertoires pour chaque URL (peut-être?)

Une façon d'obtenir de jolis permaliens sans toucher à Apache serait d'écrire un script qui générerait un répertoire réel pour chaque URL de votre choix, puis stockerait un index.php qui chargerait WordPress. Bien sûr, cela représenterait un effort énorme pour un bénéfice minime et obligerait le serveur à disposer d'un accès en écriture, ce qui doit être pire que d'utiliser un fichier .htaccess.

Je déteste l'admettre, mais c'est ce que j'ai fait vers 1998 avec un site Web basé sur .ASP lorsque IIS ne prenait pas en charge la réécriture d'URL (et même aujourd'hui, il s'agit toujours d'un véritable PITA!). Je détestais ça, mais les URL étaient sûrement bonnes pour les utilisateurs et pour le référencement!

Meilleure solution? Ajouter des règles de réécriture à httpd.conf

Retour à ce qui est probablement votre meilleure solution, et @Simon Brown l'a en fait recommandée; ajoutez vos règles de réécriture à httpd.conf ou à l’un des fichiers inclus tels que httpd-vhosts.conf (qui correspond à la configuration d’Apache sur l’hôte local sur mon Mac). Ajoutez la directive suivante en veillant à modifier le répertoire afin qu’il corresponde à celui de votre site:

<Directory "/home/example_user/public_html/">
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>

Prime! Avec le verrouillage, la performance aussi

Cette dernière option devrait éliminer tout .htaccess et leur redonner le contrôle. Mieux encore, il est légèrement plus performant puisque httpd.conf n’est chargé qu’une fois au démarrage d’Apache maisles fichiers .htaccess sont chargés et analysés à chaque requête d’URL!

P.S. Une dernière chose à considérer serait de front-end Apache avec un serveur de mise en cache tel que Nginxqui, selon moi, est en train de devenir une meilleure pratique pour les sites WordPress à fort trafic qui en ont vraiment besoin être performant. Cela pourrait prendre du temps, car je ne pense pas que la plupart des gens utilisent Nginx pour réécrire les URL pour Apache, mais si cette direction vous intéresse, voici quelques liens à suivre:

15
MikeSchinkel

Permaliens sans mod_rewrite

Sans fichier .htaccess ni modification de votre fichier httpd.conf, le mieux que vous puissiez faire est de créer des permaliens pathinfo. Les permaliens de Pathinfo sont les mêmes que de jolis permaliens, sauf qu'ils commencent par index.php.

Pour utiliser pathinfo permaliens, mettez index.php/au début de votre structure de permalien personnalisée:

/index.php/%postname%/

Voir le article du Codex pour plus d'informations.

2
Chris_O

De retour au bon vieux temps, WordPress avait besoin d'écrire un nouveau fichier de configuration chaque fois que vous changiez la structure de lien permanent. Dans les configurations modernes, les règles Rewrite ne changent pas:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Toutes les demandes de fichiers non existants (c.-à-d. Un chemin d'accès permanent personnalisé qui ne correspond à aucun fichier du système de fichiers) sont transmises via index.php, et $_SERVER['REQUEST_URI'] indique à PHP ce qui a été réellement demandé. Votre client peut définir les règles de réécriture dans httpd.conf ou .htaccess. Vous n'avez pas besoin de le modifier lorsque vous ajustez la structure de lien permanent.

Certains plugins tentent de modifier eux-mêmes .htaccess ou vous demandent de modifier le fichier. Cette solution peut ne pas convenir à tout le monde, mais cela vaut la peine d'être envisagé.

0
Annika Backstrom