我正在尝试使用mod_rewrite 403阻止URL(/wp-admin/admin-ajax.php?action=force_refresh_get_site_version
)。这是.htaccess
文件:
RewriteEngine on
RewriteCond %{QUERY_STRING} \baction=force_refresh_get_site_version\b [NC]
RewriteRule ^ - [F,L]
# 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
...但是,这给了我404。
但是如果我删除这两行:
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
...我被禁止了403。有点令人困惑。感谢您为解决此问题提供的帮助。
答案 0 :(得分:0)
有些令人困惑。
是的,这没有任何意义!似乎还有“别的东西”在发生?
您发布的指令将阻止所声明的URL-实际上,由于您没有检查URL路径,因此它可能会阻止太多。要阻止特定于 的网址,您可以使用类似以下内容的内容:
RewriteCond %{QUERY_STRING} ^action=force_refresh_get_site_version$
RewriteRule ^wp-admin/admin-ajax.php$ - [F]
L
标志是多余的,当您使用F
标志时会被暗示 。
404响应状态的一个可能原因是,您的自定义403(在.htaccess
或服务器配置中定义)是否覆盖了状态代码并显式设置了404。(这在某些共享服务器上并不少见。)但是,这似乎与您在下面看到的内容无关……
但是如果我删除这两行:
RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f
这两行似乎与问题无关,因为前面的指令应该已经阻止了该请求。
第一个RewriteRule
只是一个“优化”,可以防止在调用前控制器(通过最后一个RewriteRule
指令)时不必要的文件系统检查。
如果您删除第一个RewriteCond
指令,则意味着该请求(您尝试阻止的请求)否则将由WordPress前端控制器处理(不是针对较早的指令,应该阻止请求)。这很可能会导致404,而不是403。它还会断开状态资源(CSS,JS,图像等)的所有链接,因此您的网站不太可能正常工作?!
检查文件系统路径中是否有其他.htaccess
个文件,因为它们可能会产生冲突?