我在使用Wordpress或某些插件时偶尔会更新/覆盖我的.htaccess文件,这会在访问帖子时返回404错误页面。为了解决这个问题,我需要再次保存永久链接。
我在网站上删除了url slug“categories”,所以看起来像这样:
原始
www.mysite.com/category/post-title
更新了hack
www.mysite.com/post-title
我安装了+20个插件,我不确定是什么导致了这个问题。
是否有可能拒绝Wordpress和插件写入.htaccess文件?
这是我在functions.php
中禁用URL slug的类别/* Kill category base */
function kill_category_base ($string) {
$string = str_replace('category/', '', $string);
return $string;
}
add_filter('category_link', 'kill_category_base');
这是我的.htaccess
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
# redirect everything else to wordpress
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
# END WordPress
答案 0 :(得分:2)
如果您具有对服务器的ssh访问权限,则可以发出以下命令来限制对该文件的写入权限,以便除root用户之外的任何人都可以编辑该文件,包括WordPress:
chmod 444 .htaccess
您需要以root用户身份运行此命令,或者以文件的当前拥有用户身份运行此命令。
如果你没有ssh访问你的服务器,那么你在这里几乎没有选择。如果是这种情况,您将需要搜索所有插件的代码并找出写入该文件的插件。然后停用该插件,或者更改代码,使其不再写入该文件。
<强>更新强>
我注意到有几个人在这里给我的答案一点点了。我读了所有这些,并重新阅读了这个问题。事实证明,我一定是误读了这个问题。
我原来的回答是基于安全观点。我认为问题是询问如何防止文件被覆盖,从安全的角度来看,可能是因为你的网站遭到黑客攻击或其他什么。如果是这种情况,将权限设置为444将在100%的时间内工作,但您需要基本上完成所有文件,除了少数几个文件和上传目录。实际上,这样做,同时保持我的所有插件都是最新的,阻止了我公司亲自托管的任何网站遭到黑客攻击,我们拥有近300个,流量范围从1000 /月到5亿/月。部署过程稍长一些,但安全警惕的好处严重影响了额外部署时间的后果。
但是,问题不在于这个问题,所以我很糟糕。事实上,经过再次观察,并且实际上这次理解了这个问题,@ mr_mmmmore已接近正确的答案。你只需要在# BEGIN WordPress
和# END WordPress
之外移动你的修改,但是它还有一些更多。
如果您希望(大多数)插件也不会覆盖您的更改(不仅仅是核心WordPress),您还需要 将 代码包装在类似的标记中。否则,在更新htaccess时,您的代码可能仍会被删除。您的最终文件应如下所示:
# BEGIN MyCodeTop
RewriteEngine On
RewriteBase /
# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
# END MyCodeTop
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]
# END WordPress
# BEGIN MyCodeBottom
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
# END MyCodeBottom
一般来说,WordPress本身会保留对htaccess文件的更改,而不会修改它们,即使它们不在自己的标记组中;然而,也有少数的插件在那里,bastardize该管理htaccess文件,以及滥用它们以这样的方式,他们拉闸只删除更改核心WordPress的功能,因为他们没有自己的标记组内部存在。为了安全起见,最好只遵循WordPress标准,制作自己的标记组,并将代码放在那里。
感谢@mr_mmmmore让我重读这里的问题,因为我第一次完全错过了这一点。加一个。
答案 1 :(得分:1)
拒绝Worpress写入.htaccess似乎对你遇到的问题有些过分。另外一些插件依赖于能够写入.htaccess,所以我不建议不考虑可能的后果(例如缓存插件可能需要添加重写规则)。
而且您不必这样做:WP删除您自己的编辑的原因是因为您将它们放在#BEGIN Wordpress和#END Wordpress注释之间。您无法控制它们之间的内容:将其视为.htaccess文件中的保留位置,WP可以执行其所需的任何操作。 WP中未添加的所有内容都将在某个时候删除。
所以你所要做的就是将你的编辑移到BEGIN / END WP评论之外,就像这样(你必须决定WP规则之前和之后必须做什么):
# editings that must run before WP rewrite rules
#-------------------------
RewriteEngine On
RewriteBase /
# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]
# END WordPress
# editings that must run after WP rewrite rules
#-------------------------
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
定义WP规则之前或之后必须执行的操作取决于您想要执行的操作。通常我会在最后保留WP规则并将其放在我的面前。
答案 2 :(得分:0)
到目前为止,我已经在各种网站上与这个.htaccess reset
问题争论了半年多。
我的临时解决方案是每次发生这种情况时重新安装最新的文件系统备份(.zip)(在某些情况下甚至避免网站显示正确或至少甚至显示,但在大多数情况下,它避免管理员进入管理面板)。
真正的解决方案似乎非常简单,但仅适用于您的网站遭到黑客攻击的情况(尚未能够了解这些网站被黑客入侵的方式或时间)。在这种情况下,wp-includes/nav-menu.php
文件已损坏并强制.htaccess重置为默认值并将其权限设置为444。
因此,解决方案是使用正确的WP版本恢复该文件。
然而,这不是解决安全问题的方法,允许这种黑客发生,我怀疑许多不同的插件可能是这种类型的黑客的漏洞或后门。因此,您可以采取的措施是安装Sucuri Security - Auditing, Malware Scanner and Security Hardening
或Wordfence
插件来解决安全问题。
就个人而言,安装插件以增强网站的安全性似乎与在PC中安装防病毒类似。我还会推荐一些像Cloudflare这样的环境方法。
答案 3 :(得分:0)
如果您真的知道自己在做什么,您可以阻止 wordpress 更新您的 .htaccess
文件。将此行放在 wp-config.php
的末尾(在 require_once
之后):
add_filter('got_rewrite', '__return_false');
您也可以在 mu-plugin/plugin 中使用此过滤器。
我比 chmod
hack 更喜欢这个解决方案,因为它不会在日志中发送垃圾邮件权限错误。
答案 4 :(得分:-1)
CHMOD没有工作Wordpress重写它 无论线条是否在Begin和ND Wordpress之间 没有安装插件,WORDPRESS重写它 这里没有答案是正确的