web-dev-qa-db-fra.com

Arrêtez WordPress et les plugins d’écraser .htaccess

Comment empêcher WordPress et les plugins d'écraser mon fichier .htaccess? J'utilise Wordpress pour définir la structure de mes permaliens; Je doute donc qu'il soit pratique de refuser toutes les autorisations sur le fichier.

S'il est peu probable que WordPress soit responsable de l'écrasement du fichier, il serait utile de nous aider à déterminer ce qui est responsable.

J'ai récemment ajouté ces règles à .htaccess pour rediriger le trafic vers HTTPS.

    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

Un jour plus tard, j'ai trouvé que .htaccess était revenu à son état précédent. Voici une partie du fichier .htaccess telle que je l’entends.

# BEGIN W3TC Page Cache core
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
    RewriteCond %{HTTPS} =on
    RewriteRule .* - [E=W3TC_SSL:_ssl]
    RewriteCond %{SERVER_PORT} =443
    RewriteRule .* - [E=W3TC_SSL:_ssl]
    RewriteCond %{HTTP:Accept-Encoding} gzip
    RewriteRule .* - [E=W3TC_ENC:_gzip]
    RewriteCond %{HTTP_COOKIE} w3tc_preview [NC]
    RewriteRule .* - [E=W3TC_PREVIEW:_preview]
    RewriteCond %{REQUEST_METHOD} !=POST
    RewriteCond %{QUERY_STRING} =""
    RewriteCond %{REQUEST_URI} \/$
    RewriteCond %{HTTP_COOKIE} !(comment_author|wp\-postpass|w3tc_logged_out|wordpress_logged_in|wptouch_switch_toggle) [NC]
    RewriteCond "%{DOCUMENT_ROOT}/wp-content/cache/page_enhanced/%{HTTP_Host}/%{REQUEST_URI}/_index%{ENV:W3TC_SSL}%{ENV:W3TC_PREVIEW}.html%{ENV:W3TC_ENC}" -f
    RewriteRule .* "/wp-content/cache/page_enhanced/%{HTTP_Host}/%{REQUEST_URI}/_index%{ENV:W3TC_SSL}%{ENV:W3TC_PREVIEW}.html%{ENV:W3TC_ENC}" [L]
</IfModule>
# END W3TC Page Cache core

Ce code redirige le trafic avec un statut de 301 comme prévu, jusqu'à ce que le fichier .htaccess soit écrasé.

--Mise à jour-- En plaçant des commentaires dans plusieurs sections du fichier .htaccess et en observant celui qui a été écrasé, j'ai constaté que le plugin W3 Total Cache remplaçait l'intégralité de la section commentée.

# BEGIN W3TC Page Cache core
1

Si vous placez vos directives "personnalisées" en dehors de tout marqueur de commentaire # BEGIN .../# END ..., WordPress (et les plugins) ne devrait pas les écraser lors de leur mise à jour. (Bien sûr, si vous avez des plugins qui ne "jouent pas à Nice", ils peuvent faire n'importe quoi pour .htaccess si vous les laissez, vous devrez donc faire quelque chose comme ce que @haz suggère dans ce cas.)

Dans votre cas, vous pouvez simplement placer ces directives au-dessus du commentaire # BEGIN W3TC Page Cache core. Par exemple:

# Custom directives
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

# BEGIN W3TC Page Cache core
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTPS} =on
    RewriteRule .* - [E=W3TC_SSL:_ssl]
    :

Vous n'avez pas besoin de répéter la directive RewriteEngine On (à condition que cela se produise quelque part dans le fichier). Et vos directives n'utilisent pas RewriteBase de toute façon - mais encore une fois, RewriteBase ne doit apparaître qu'une seule fois dans le fichier. (La dernière instance de chacune de ces directives est ce qui contrôle tout le fichier.)

( A part: Les parenthèses autour de la variable RewriteRule - sont superflues dans votre directive.)

2
MrWhite

Wordpress réécrira définitivement votre fichier .htaccess dans certaines circonstances, par exemple si vous modifiez des liens permanents.

Comme vous, nous avons un tas de choses personnalisées dans le fichier .htaccess, que je préférerais laisser entre les mains de nos gars de devOps plutôt que de Wordpress.

Le moyen le plus simple si vous avez accès au serveur est de modifier les autorisations de fichier sur .htaccess.

& chmod a-w .htaccess

Cela supprime l'accès en écriture pour tous les utilisateurs. Si vous ne disposez pas d'un accès Shell à votre instance Wordpress, votre fournisseur d'hébergement peut vous fournir un paramètre de type Explorateur de fichiers vous permettant de modifier vos autorisations de fichiers.

Alternativement, vous pouvez changer la propriété du fichier:

& chown root:root .htaccess
& chmod 644 .htaccess

Cela peut ne pas fonctionner en fonction de vos paramètres utilisateur Apache et ce n’est certainement pas une option proposée par votre fournisseur d’hébergement.

Une troisième option que vous pouvez utiliser, vous obligeant à nouveau à contrôler votre serveur, consiste à placer vos paramètres immuables (tels que votre réécriture HTTPS) dans un fichier include différent dans vos paramètres VirtualHost.

<VirtualHost *>
    ServerName www.mysite.com
    DocumentRoot /var/www/mysite.com/wordpress/
    Include /var/www/mysite.com/custom-Apache-settings.conf
</VirtualHost>
4
haz

Comme le dit Haz dans sa réponse, WordPress va (et devrait pouvoir) écraser le fichier .htaccess.

Vous pouvez cependant utiliser mod_rewrite_rules filter pour ajouter le vôtre. Pour rester simple, vous pouvez ajouter un fichier .htaccess.custom, y placer vos règles et ajouter son contenu à $ rules dans le filtre. N'oubliez pas de retourner $ rules.

1
janh