如何防止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
最合适的回答,由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网友: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 );