"命令拒绝,允许"只有在重写规则之后才有效?

时间:2015-09-07 14:36:54

标签: wordpress .htaccess mod-rewrite

我有一个wordpress网站,我想暂时阻止访问,并将order deny,allow添加到.htaccess文件中:

RewriteEngine off
order deny,allow
deny from all
allow from [my ip]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

但是,它没有用。

我尝试将其移至重写规则以下:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

RewriteEngine off
order deny,allow
deny from all
allow from [my ip]

开始工作了。

为什么它不适用于第一个例子?

1 个答案:

答案 0 :(得分:0)

在Wordpress htaccess中,这个评论:

# BEGIN WordPress
# END WordPress

Wordpress使用它来动态添加其他规则。如果您查看wp-admin/includes/misc.php,会有一个名为save_mod_rewrite_rules的函数来处理您的htaccess的写入。在此函数中,规则来自mod_rewrite_rules WP_Rewrite方法wp-includes/rewrite.php,这是$rules = apply_filters( 'mod_rewrite_rules', $rules ); 中的一个类。如果你研究那种方法,你会看到最后一行:

allow, deny

这意味着过滤器应用于规则,因此无论插件/主题是什么,都可以覆盖此规则以添加自己的规则,因此添加访问策略。也许WP核心添加他自己的拒绝/允许规则。所以这可能是你的问题。

RewriteCond规则的另一种解决方案是使用<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REMOTE_ADDR} !^[your IP]$ RewriteRule ^(.*)$ - [R=403,L] </IfModule> 为除您之外的所有IP抛出403(将其置于htaccess的顶部):

GetCustomUI