Sauter la navigation

Il s'agit du forum d'assistance technique de WPML, le plug-in multilingue pour WordPress.

Il est accessible à tous, toutefois seuls les clients de WPML peuvent y publier leurs messages. L'équipe du WPML répond sur le forum 6 jours par semaine, 22 heures par jour.

Ce sujet contient 8 réponses, a 3 voix.

Dernière mise à jour par Nicolas V. Il y a 1 année et 4 mois.

Assisté par: Nicolas V..

Auteur Articles
Septembre 19, 2023 à 11:40 pm #14425685

francoisT-16

Bonjour,

Le site a récemment rencontré des erreurs 500. J'ai réussi à résoudre le problème en modifiant le fichier .htaccess. Plus précisément, j'ai remplacé :

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /en/
RewriteRule ^index\.php$ - [L]
RewriteRule ^en/wp-login.php /en/wp-login.php [QSA,L]
RewriteRule ^fr/wp-login.php /en/wp-login.php [QSA,L]
RewriteRule ^es/wp-login.php /en/wp-login.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /en/index.php [L]
</IfModule>

par :

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteRule ^en/wp-login.php /wp-login.php [QSA,L]
RewriteRule ^fr/wp-login.php /wp-login.php [QSA,L]
RewriteRule ^es/wp-login.php /wp-login.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Ce problème semble correspondre à un souci connu décrit ici : https://wpml.org/errata/htaccess-is-rewritten-with-language-folder/

Selon cette documentation, le problème proviendrait de multiples appels à "flush_rewrite_rules(true)". Comment puis-je identifier le coupable de ces appels ?

La solution temporaire proposée dans la documentation est-elle toujours valide ? Idéalement, je souhaiterais identifier la source du problème plutôt que d'appliquer un patch.

Voici les principaux éléments de mon environnement :

Serveur O2Switch
LiteSpeed Cache
Thème Flatsome
WooCommerce
WPML

Merci pour votre aide.

Septembre 20, 2023 à 5:55 am #14426293

Andrés
Supporter

Les langues: Anglais (English ) Espagnol (Español ) Français (Français )

Fuseau horaire: Europe/Paris (GMT+01:00)

Bonjour,

Bienvenue à l'assistance technique de WPML.

En effet, cette solution est toujours valide. Or, si vous souhaitez identifier la source du problème, s'il vous plaît, essayez le suivant dans votre site de test :

Dans votre site de test, est- ce que vous pouvez vérifier si cette situation arrive quand:
- Seulement le paquet WPML est activé. Cela va nous dire s’il y a un problème d’interaction avec une autre extension.
- Vous changez votre thème pour un thème par défaut de WordPress. Cela va nous dire s’il y a un problème d’interaction avec votre thème.
- Si le problème disparait, est-ce que vous pouvez commencer à les activer, un par un jusqu'au problème revient ?

Cordialement,
Andrés

Septembre 20, 2023 à 8:58 am #14427861

francoisT-16

Bonjour Andrés,

Merci pour votre réponse rapide.

Je n'ai actuellement plus de site de test. Cependant, lors de mes précédentes tentatives, je n'avais pas réussi à reproduire le problème sur celui-ci (ce n'est pas la première fois que je rencontre des erreurs 500).

Il est possible que le souci provienne d'une incompatibilité entre WPML et LiteSpeed Cache. En effet, LiteSpeed Cache ne fonctionne pas sur les sous-domaines comme mon site de test (c'est la seul différence notable avec le site live).

Pour un autre client ayant un environnement très similaire (WPML, LiteSpeed Cache, thème Flatsome) et qui a rencontré le même problème pendant longtemps, j'ai découvert récemment que l'erreur venait d'un mauvais port (11211 au lieu de 6379) configuré dans LiteSpeed Cache pour le cache objet en mode Redis. Cependant, j'ai vérifié pour ce site-ci, et le port est correctement configuré.

Le fix "temporaire" suggéré dans la documentation date déjà de 2017. N'y a-t-il pas eu de nouvelles avancées depuis ? Je me demande, peut-être à tort, si ce fix ne fait que "cacher la misère" sans résoudre le problème à la source.

Merci pour votre aide.

Septembre 20, 2023 à 11:21 pm #14433873

Nicolas V.
Supporter

Les langues: Anglais (English ) Français (Français )

Fuseau horaire: America/Lima (GMT-05:00)

Bonjour,

Je vous réponds rapidement car Andrés n'est pas disponible.

LiteSpeed Cache est déclaré compatible avec WPML mais il se peut qu'il y ait un conflit/bug dans une configuration spécifique. Essayez de désactiver ce plugin pour un moment le temps de voir si cela résout le problème. De cette manière nous serons sûrs de la source du problème, ce qui aidera à trouver une solution par la suite.

L'idéal serait de pourvoir retravailler sur une copie staging comme Andrés l'a mentionné afin de tester WPML dans un environnement minimal en suivant cette procédure:
- Désactivez tous les plugins qui ne sont pas liés à WPML et changez de thème pour un thème WordPress comme 2020.
- Si l'erreur disparaît commencez à réactiver les plugins un par un ou en petit groupe. De cette manière il vous sera possible d'identifier quel plugin crée un conflit.

En ce qui concerne le workaround, cette solution est toujours d'actualité. En cherchant rapidement sur le forum vous trouverez plusieurs tickets datant de 2022 par exemple celui-ci: https://wpml.org/es/forums/topic/errores-500-problema-en-htacess/

Septembre 21, 2023 à 8:09 am #14435601

francoisT-16

Bonjour Nicolas,
Merci pour votre réponse.

Le problème étant aléatoire, le staging n'avait bien souvent pas de problème durant de longues périodes. La comparaison n'est pas totalement fiable, car le staging est inactif, contrairement au site live qui reçoit des visites et des commandes. Aussi, O2Switch indique que LiteSpeedCache n'est pas compatible sur les sous-domaines donc non actif sur le staging.

Je vais chercher une solution pour pouvoir loguer les appels à la fonction flush_rewrite_rules(true) pour trouver quel plugin/thème génère ces nombreux appels.

Quant à la question de savoir ce que fait le fix temporaire (temporaire depuis 2017 tout de même) proposé par WPML et si celui-ci "cache la misère", la réponse de GPT-4 est la suivante : :

"Le code donné est un correctif temporaire pour un problème où le fichier `.htaccess` est mal écrit à cause de l'interaction entre WPML (un plugin de traduction pour WordPress) et certains autres plugins tiers qui réinitialisent fréquemment les règles de réécriture (`flush_rewrite_rules()`).

add_filter('mod_rewrite_rules', 'fix_rewritebase');
function fix_rewritebase($rules){
    $home_root = parse_url(home_url());
    if ( isset( $home_root['path'] ) ) {
        $home_root = trailingslashit($home_root['path']);
    } else {
        $home_root = '/';
    }
 
    $wpml_root = parse_url(get_option('home'));
    if ( isset( $wpml_root['path'] ) ) {
        $wpml_root = trailingslashit($wpml_root['path']);
    } else {
        $wpml_root = '/';
    }
 
    $rules = str_replace("RewriteBase $home_root", "RewriteBase $wpml_root", $rules);
    $rules = str_replace("RewriteRule . $home_root", "RewriteRule . $wpml_root", $rules);
 
    return $rules;
}

Voici une explication détaillée de ce que fait le code :

1. **Ajout d'un filtre** : `add_filter('mod_rewrite_rules', 'fix_rewritebase');`
- Ceci ajoute un filtre à la fonction WordPress qui génère les règles de réécriture pour le fichier `.htaccess`. Lorsque WordPress est sur le point de générer ces règles, il passera par notre fonction `fix_rewritebase()`.

2. **Fonction `fix_rewritebase`** :
- Cette fonction prend en entrée les règles actuelles de réécriture (`$rules`).

3. **Récupération de l'URL de base du site** :
- La fonction `parse_url(home_url())` est utilisée pour obtenir l'URL de base de votre site.
- Si une partie 'path' existe dans cette URL, elle est récupérée, sinon, elle utilise `/`.

4. **Récupération de l'URL de base de WPML** :
- La fonction `parse_url(get_option('home'))` est utilisée pour obtenir l'URL de base configurée pour WPML.
- Si une partie 'path' existe dans cette URL, elle est récupérée, sinon, elle utilise `/`.

5. **Remplacement des règles** :
- Le code remplace ensuite deux règles de réécriture dans `$rules` :
- `RewriteBase $home_root` est remplacé par `RewriteBase $wpml_root`
- `RewriteRule . $home_root` est remplacé par `RewriteRule . $wpml_root`

6. **Retour des règles modifiées** :
- Enfin, la fonction retourne les règles modifiées, qui seront alors utilisées pour écrire le fichier `.htaccess`.

En résumé, ce patch modifie la génération du fichier .htaccess pour qu'il utilise l'URL de base de WPML au lieu de celle du site. Cela permet de s'assurer que l'URL correcte est utilisée même si un autre plugin tente de réinitialiser les règles de réécriture pendant que WPML est en cours d'utilisation.

Si vous vous demandez si ce patch "cache la misère", la réponse est oui. C'est en effet un correctif temporaire. Le vrai problème est que le ou les plugins tiers réinitialisent les règles de réécriture trop souvent. Le correctif idéal serait de trouver et de corriger le ou les plugins tiers responsables. En attendant, ce patch empêche le site de se casser à cause de cette interaction."

Merci Nicolas.

Septembre 21, 2023 à 5:39 pm #14441489

Nicolas V.
Supporter

Les langues: Anglais (English ) Français (Français )

Fuseau horaire: America/Lima (GMT-05:00)

Bonjour,

ce patch modifie la génération du fichier .htaccess pour qu'il utilise l'URL de base de WPML au lieu de celle du site. Cela permet de s'assurer que l'URL correcte est utilisée même si un autre plugin tente de réinitialiser les règles de réécriture

Oui c'est exactement ce que fait ce code.

fix temporaire (temporaire depuis 2017 tout de même)

Je vous explique pourquoi le code dans cet errata est toujours valide aujourd'hui.
- Ce code permet d'éviter un problème produit par des plugins tiers. C'est un problème "extérieur" qui n'est pas produit par WPML mais oui, il se produit lorsque WPML est activé. De plus, ce n'est pas spécifique à un plugin pour lequel nous pourrions coder une solution permanente dans une nouvelle version de WPML ou encore demander à l'auteur de corriger son code.

Cette solution est donc proposée aux utilisateurs de tout niveau. Mais je suis d'accord avec vous, si vous arrivez à identifier le plugin responsables des nombreux flush_rewrite_rules ce serait l'idéal.

Septembre 26, 2023 à 11:16 pm #14469885

francoisT-16

Merci Nicolas.
Pour l'instant, pas d'erreur, mais j'aimerais pouvoir dormir sur mes deux oreilles sur le parc de sites où j'utilise WPML.
Dans mon cas, je pense que l'incompatibilité est entre LiteSpeed Cache et WPML car, en dehors de celui-ci, je n'utilise pas de plugins sensibles et j'utilise le thème Flatsome qui est reconnu compatible avec WPML.
Bonne continuation.

Septembre 26, 2023 à 11:30 pm #14469887

francoisT-16

Re bonsoir,

J'ai malheureusement parlé trop vite, une nouvelle erreur 500 est survenue à cause de la réécriture du htaccess 🙁
Je me résigne à mettre en place le patch "temporaire" dans functions.php, mais c'est un peu dommage de devoir bidouiller pour que WPML soit fonctionnel. Je sais que toute votre équipe soutient que WPML n'est pas responsable. Cependant, il est indéniable que le problème survient uniquement lorsque WPML est présent sur le site. Il aurait été appréciable qu'une solution pérenne soit trouvée par vos développeurs pour assurer la compatibilité de WPML avec des environnements pourtant répandus.

Merci.

Septembre 27, 2023 à 8:48 pm #14477501

Nicolas V.
Supporter

Les langues: Anglais (English ) Français (Français )

Fuseau horaire: America/Lima (GMT-05:00)

Bonjour,

Pour clarifier tout cela:
- Oui le problème se produit car WPML est activé mais ce n'est pas WPML qui est responsable du problème.
- Les solutions "workaround" sont des solutions d'appoint qui ne sont pas "encore" ajoutées au code de WPML core. Certaines sont ajoutées plus tard dans de nouvelles versions. Mais dans le cas de celle-ci, comme elle se produit de manière aléatoire et en fonction de plugins tiers, il est difficile de mettre en place une solution permanente dans une nouvelle version de WPML ou encore demander à l'auteur de corriger son code.

Ce que nous pouvons faire:
- Vous pouvez installer temporairement l'extension "Duplicator". Elle vous permettra de faire une copie complète de votre site et de son contenu.
J'ai activé un champ privé pour votre prochaine réponse pour partager les fichiers (package + installer).
- Vous devez exclure le dossier /wp-uploads pour réduire le poids de la copie
- Une fois le package est prêt, si les fichiers sont trop lourds, vous pouvez partager un lien Google Drive, Dropbox, WeTransfer ou autre.

Je peux ensuite installer cette copie sur nos serveurs, et si le problème se reproduit (ce n'est pas garanti), je ferai remonter cela à notre équipe de deuxième niveau.