阻止WordPress和插件覆盖.htaccess

时间:2017-10-09 作者:Jacob Quisenberry

如何防止WordPress和插件覆盖.htaccess 文件我使用Wordpress设置永久链接的结构;因此,我怀疑拒绝该文件的所有权限是否切实可行。

如果WordPress不太可能负责覆盖文件,那么关于确定责任的建议将很有帮助。

我最近将这些规则添加到。htaccess将流量重定向到HTTPS。

    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
一天后,我发现了。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
此代码按预期重定向状态为301的流量,直到。htaccess文件被覆盖。

--更新--在的几个部分中放置注释。htaccess文件并观察哪一个被覆盖,我发现插件W3 Total Cache重写了注释为

# BEGIN W3TC Page Cache core

5 个回复
最合适的回答,由SO网友:MrWhite 整理而成

如果您将“自定义”指令置于# BEGIN ... / # END ... 然后WordPress(和插件)的注释标记在更新时不应覆盖它们。(当然,如果你的插件“表现不好”,那么他们可以做任何事情.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 在文件中只应出现一次。(每个指令的最后一个实例是控制整个文件的对象。)

(放在旁边:围绕RewriteRule 模式在指令中是多余的。)

SO网友:haz

Wordpress肯定会重写您的。在某些情况下,例如更改永久链接时,htaccess文件。

像你一样,我们也有很多定制的东西。htaccess文件,我宁愿把它交给我们的devOps人员,而不是Wordpress。

如果您有权访问服务器,最简单的方法是更改上的文件权限。htaccess

& chmod a-w .htaccess
这将删除所有用户的写访问权限。如果您没有Wordpress实例的shell访问权限,则托管提供商可能会提供文件资源管理器类型设置,您可以在其中更改文件权限。

或者,您可以更改文件所有权:

& chown root:root .htaccess
& chmod 644 .htaccess
根据您的Apache用户设置,这可能不起作用,而且几乎可以肯定的是,托管提供商不会提供这一选项。

您可以使用的第三个选项(再次要求您控制服务器)是将不可变设置(例如HTTPS重写)放入VirtualHost设置中的不同包含文件中。

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

SO网友:janh

正如haz在回答中所述,WordPress将(并且应该能够)覆盖。htaccess。

您可以使用mod_rewrite_rules 但要添加自己的过滤器。为了保持简单,您可以添加一个文件。htaccess。自定义,将您的规则放入其中,并将其内容添加到筛选器中的$规则。不要忘记返回$规则。

SO网友:Petrus Vermaak

一个更优雅的答案是阻止WordPress向。htaccess位于#BEGIN WordPress和#END WordPress块之间。巧合的是,它还将阻止任何其他插件写入该部分。

# BEGIN Custom Block Code
<IfModule mod_ignore_wordpress.c>

# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

</IfModule>
# END Custom Block Code

SO网友:Ludwig

有多种可能干预WordPress\'.htaccess 文件操作:

防止WP完全编辑您现有的.htaccess 文件,最好更改或删除写入权限或所有者:组。WP检查文件是否可写,如果不可写,则不会尝试更改它。

阻止WP创建.htaccess 文件,或者如果您无法更改服务器上的权限,并且希望阻止WP编辑您的文件,请添加flush_rewrite_rules_hard 过滤器在插件代码或主题中返回falsefunction.php

// Please leave .htaccess file untouched
add_filter(\'flush_rewrite_rules_hard\',\'__return_false\');
<在编写插件或主题时,需要在.htaccess 文件,使用mod_rewrite_rules 筛选以添加配置行
在插件或主题中使用此选项function.php
// Add extra config lines to .htaccess
add_filter( \'mod_rewrite_rules\', function( $rules ) {
    return $rules . \'
# My rules ...
# ... go here
\';
} );
<您想查看WP在您的.htaccess 但如果不想应用,可以添加此筛选器
// Comment out all configuration WordPress adds to .htaccess
add_filter( \'mod_rewrite_rules\', function( $rules ) {
    return \'# \' . str_replace("\\n", "\\n# ", $rules);
}, 100 );

结束

相关推荐

有关加载403/404错误页面和htaccess的问题

我上传了一个html 403和404页面到我的WordPress主题目录,如果我在之后遇到了一个随机错误。com,如。com/yyyy然后加载404页,例如-所以一切都很好。。。然而我想要403。当我允许的IP字符串之外的人试图访问我的登录页面时,将显示php。这htaccess规则工作得很好,但它在WordPress试图找到403时创建了一个永无止境的循环。php页面。。<IfModule mod_rewrite.c> RewriteEngine on RewriteCond