Wie kann ich verhindern, dass WordPress und Plugins meine .htaccess
-Datei überschreiben? Ich benutze Wordpress, um die Struktur meiner Permalinks festzulegen. Daher bezweifle ich, dass es praktisch ist, alle Berechtigungen für die Datei zu verweigern.
Wenn es unwahrscheinlich ist, dass WordPress für das Überschreiben der Datei verantwortlich ist, ist es hilfreich, zu bestimmen, was verantwortlich ist.
Ich habe diese Regeln kürzlich zu .htaccess hinzugefügt, um den Datenverkehr zu HTTPS umzuleiten.
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
Einen Tag später stellte ich fest, dass .htaccess zu seinem vorherigen Zustand zurückgekehrt war. Das Folgende ist ein Teil der .htaccess-Datei, wie ich es beabsichtige.
# 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
Dieser Code leitet den Verkehr mit dem Status 301 wie erwartet weiter, bis die .htaccess-Datei überschrieben wird.
--Update-- Durch das Platzieren von Kommentaren in mehreren Abschnitten der .htaccess-Datei und das Beobachten, welcher überschrieben wurde, stellte ich fest, dass das Plug-in W3 Total Cache den gesamten Abschnitt überschrieb, mit dem der Kommentar geschrieben wurde
# BEGIN W3TC Page Cache core
Wenn Sie Ihre "benutzerdefinierten" Anweisungen außerhalb von # BEGIN ...
/# END ...
Kommentar-Markierungen platzieren, sollten WordPress (und Plugins) diese nicht überschreiben, wenn sie aktualisiert werden. (Wenn Sie Plugins haben, die nicht "Nice" spielen, können sie .htaccess
ändern, wenn Sie dies zulassen. In diesem Fall müssten Sie also etwas tun, wie es @haz vorschlägt.)
In Ihrem Fall können Sie diese Anweisungen einfach über dem # BEGIN W3TC Page Cache core
-Kommentar platzieren. Zum Beispiel:
# 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]
:
Sie müssen die RewriteEngine On
-Direktive nicht wiederholen (sofern sie irgendwo in der Datei vorkommt). Und Ihre Direktiven verwenden RewriteBase
sowieso nicht - aber auch hier sollte RewriteBase
nur einmal in der Datei vorkommen. (Die letzte Instanz jeder dieser Anweisungen steuert die gesamte Datei.)
( Nebenbei: Die Klammern um die RewriteRule
Muster sind in Ihrer Direktive überflüssig.)
Wordpress schreibt Ihre .htaccess-Datei unter bestimmten Umständen definitiv neu, z. B. wenn Sie Permalinks ändern.
Wie Sie haben wir eine Reihe von benutzerdefinierten Dingen in unserer .htaccess-Datei, die ich lieber unseren devOps-Mitarbeitern als Wordpress überlassen würde.
Wenn Sie Zugriff auf den Server haben, können Sie die Dateiberechtigungen für .htaccess am einfachsten ändern
& chmod a-w .htaccess
Dies entfernt den Schreibzugriff für alle Benutzer. Wenn Sie keinen Shell-Zugriff auf Ihre Wordpress-Instanz haben, bietet Ihr Hosting-Anbieter möglicherweise eine Einstellung für den Typ des Datei-Explorers an, in der Sie möglicherweise Ihre Dateiberechtigungen ändern können.
Alternativ können Sie den Dateibesitz ändern:
& chown root:root .htaccess
& chmod 644 .htaccess
Dies hängt möglicherweise nicht von Ihren Apache-Benutzereinstellungen ab und wird mit ziemlicher Sicherheit nicht von Ihrem Hosting-Anbieter angeboten.
Eine dritte Option, die Sie verwenden können und die wiederum erfordert, dass Sie die Kontrolle über Ihren Server haben, besteht darin, Ihre unveränderlichen Einstellungen (wie z. B. Ihr HTTPS-Umschreiben) in eine andere Include-Datei in Ihren VirtualHost-Einstellungen zu kopieren.
<VirtualHost *>
ServerName www.mysite.com
DocumentRoot /var/www/mysite.com/wordpress/
Include /var/www/mysite.com/custom-Apache-settings.conf
</VirtualHost>
Wie in seiner Antwort angegeben, wird (und sollte) WordPress den .htaccess überschreiben können.
Sie können jedoch mod_rewrite_rules filter verwenden, um eigene Regeln hinzuzufügen. Um es einfach zu halten, können Sie eine Datei .htaccess.custom hinzufügen, Ihre Regeln dort einfügen und deren Inhalt zu $ rules im Filter hinzufügen. Vergiss nicht, $ rules zurückzugeben.