web-dev-qa-db-ja.com

WordPressとプラグインが.htaccessを上書きしないようにする

WordPressとプラグインが.htaccessファイルを上書きしないようにするにはどうすればよいですか?私は私のパーマリンクの構造を設定するためにWordpressを使います。だから私はそれがファイルへのすべてのアクセス許可を拒否することは現実的ではないかと思います。

WordPressがファイルの上書きを担当する可能性が低いと思われる場合は、担当するものを特定するためのアドバイスが役立ちます。

私は最近、トラフィックをHTTPSにリダイレクトするためにこれらのルールを.htaccessに追加しました。

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

1日後、.htaccessが以前の状態に戻ったことがわかりました。以下は、意図したとおりの.htaccessファイルの一部です。

# 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

このコードは、.htaccessファイルが上書きされるまで、予想どおり301のステータスでトラフィックをリダイレクトします。

- 更新 - .htaccessファイルのいくつかのセクションにコメントを入れ、どれが上書きされたのかを観察することで、プラグインW3 Total Cacheが以下のコメントを付けたセクション全体を上書きしたことを発見しました。

# BEGIN W3TC Page Cache core
1

あなたの "カスタム"ディレクティブを# BEGIN .../# END ...コメントマーカーの外側に置くと、それらが更新されたときにWordPress(およびプラグイン)してはいけませんを上書きします。 (もちろん、 "Nice"ではないプラグインがある場合は、それらを許可していれば.htaccessに何でもできるので、この場合@hazが提案するようなことをする必要があります。)

あなたの場合、あなたは単にそれらのディレクティブを# BEGIN W3TC Page Cache coreコメントの上に置くことができます。例えば:

# 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]
    :

RewriteEngine Onディレクティブを繰り返す必要はありません(それがファイルのどこかにある場合)。そしてあなたの指令はとにかくRewriteBaseを使用していません - しかし、やはりRewriteBaseはファイル内で一度だけ現れるべきです。 (これらの各指令の最後のインスタンスは、ファイル全体を制御するものです。)

Aside:RewriteRulepatternを囲む括弧は、ディレクティブでは不要です。)

2
MrWhite

Wordpressは、パーマリンクを変更した場合など、特定の状況下では必ず.htaccessファイルを書き換えます。

あなたのように、私たちは.htaccessファイルの中にカスタムのものをたくさん持っています。私はWordpressよりもdevOpsの人たちの手に委ねることを望みます。

あなたがサーバーへのアクセス権を持っているなら最も簡単な方法は.htaccessのファイル許可を変更することです。

& chmod a-w .htaccess

これにより、すべてのユーザーに対する書き込みアクセス権が削除されます。あなたがあなたのWordpressインスタンスへのシェルアクセスを持っていないならば、あなたのホスティングプロバイダーはあなたがあなたのファイル許可を変えることができるかもしれないファイルエクスプローラタイプ設定を提供するかもしれません。

あるいは、ファイルの所有権を変更することもできます。

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

これはあなたのApacheユーザー設定によってはうまくいかないかもしれませんし、ホスティングプロバイダーから提供されるオプションではないことはほぼ間違いありません。

あなたが使うことができる3つ目のオプションは、ここでもまたあなたがあなたのサーバの管理下にいることを必要とします、あなたの不変の設定(あなたのHTTPS書き換えのような).

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

彼の答えで危険が述べたように、WordPressは.htaccessを上書きするでしょう(そしてできるはずです)。

ただし、 mod_rewrite_rules filterを使用して自分で追加することもできます。簡単にするために、ファイル.htaccess.customを追加し、そこに自分のルールを入れて、その内容をフィルタ内の$ rulesに追加することができます。 $規則を返すことを忘れないでください。

1
janh