首页 > 解决方案 > URL 上禁止 403 的问题

问题描述

我正在尝试/wp-admin/admin-ajax.php?action=force_refresh_get_site_version使用 mod_rewrite 对 URL ( ) 进行 403 阻止。这是.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 禁止。有点混乱。感谢您为解决此问题提供的任何帮助。

标签: apachemod-rewrite

解决方案


有点混乱。

是的,这没有任何意义!似乎有“其他事情”发生?

您发布的指令会阻止指定的 URL - 实际上它可能会阻止太多,因为您没有检查 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文件系统路径上的任何其他文件,因为这些文件可能会造成冲突?


推荐阅读