Regex 除非请求包含特定字符串,否则需要制定阻止空用户代理的htaccess规则

Regex 除非请求包含特定字符串,否则需要制定阻止空用户代理的htaccess规则,regex,apache,.htaccess,Regex,Apache,.htaccess,我想因为坏的bot原因阻止空的用户代理。所以我有一条规则: RewriteCond %{HTTP_USER_AGENT} ^-?$ RewriteRule ^ - [F] 现在,我们的一个客户使用RSS聚合器,其提要请求以“-”用户代理的形式出现。。。因此,我试图在这个规则中添加一个条件,即“如果请求不包含/feed”,则阻止访问。。。这是我尝试过的主要事情: RewriteCond %{HTTP_USER_AGENT} ^-?$ RewriteCond %{REQUEST_URI} !^(.

我想因为坏的bot原因阻止空的用户代理。所以我有一条规则:

RewriteCond %{HTTP_USER_AGENT} ^-?$
RewriteRule ^ - [F]
现在,我们的一个客户使用RSS聚合器,其提要请求以“-”用户代理的形式出现。。。因此,我试图在这个规则中添加一个条件,即“如果请求不包含/feed”,则阻止访问。。。这是我尝试过的主要事情:

RewriteCond %{HTTP_USER_AGENT} ^-?$
RewriteCond %{REQUEST_URI} !^(.*)(/feed)(.*)$
RewriteRule ^ - [F]
但是请求仍然被阻止。我知道只是这个规则集阻止了它,因为如果我把它注释掉,那么请求就会很好地通过


任何帮助都将不胜感激

日志清楚地表明了这一点。您有另一个重写,将/en/feed重写到/index.php,然后是/index.php,它将得到禁止的响应。将规则更改为:

RewriteCond %{HTTP_USER_AGENT} ^-?$
RewriteCond %{REQUEST_URI} !=/en/feed
RewriteRule ^ - [F,L]
(添加L标志后,我还改进了第二行,使其仅针对提要URL)


并将其放在其他重写之前。

您的提要的URL是什么?另一方面,将第二行更改为
RewriteCond%{REQUEST_URI}/feed
,因为不管怎么说,这与你在那里得到的东西是等价的。它的意思是在它所匹配的对象中的任何位置进行“/feed”。正则表达式不必匹配所有内容。你所拥有的不是问题,只是没有必要。好吧,所以我用你发布的内容替换了第二行,但是当我尝试用聚合器加载提要时,我仍然在访问日志中看到这一行:“get/en/feed/HTTP/1.1”403 218“--”,如果我注释掉所有3行,它可以在聚合器中正常加载。哦,提要可以通过以下方式访问:domain.com/en/feed,或者对于个性化版本,domain.com/en/feed/?a=whatevertheusertokenishereI我不知道该建议什么。我觉得一切都很完美。如果出现异常情况,可能会发布完整配置。实际上,如果您可以访问主服务器配置,您可以做的是指定
LogLevel rewrite:trace3
,然后您将在错误日志中看到处理指令时发生的确切情况。请把它贴出来。嗯,这是在所有其他重写之前,它仍然在阻止它。我认为这与Wordpress网站上的内容有关。如果我结束了所有其他的重写,它将无法访问代码来制作RSS提要。。。我认为从技术上讲,你的答案正是我所需要的,但不幸的是,wordpress让问题变得更加复杂(WordPress就像其他任何代码一样,我相信这是可以实现的。你不会结束其他重写,只有那些成功匹配整件事的,那些被禁止的,而不是那些与整件事不匹配的提要。在这之前一定有一些WordPress重写发生,日志显示,有一个很好的lo好的,在你的服务器配置和.htaccess文件中。你的代码在哪里?也许在问题中分享你的整个配置。弄明白了!重写需要遵循默认的wordpress重写块,以便wordpress可以正确路由到提要,然后使用规则。接受你的答案,尽管我没有使用!=我刚刚使用了!很高兴你已经解决了。很好。你应该使用=,它会使它完全匹配。否则它会在任何地方匹配任何URL和/en/feed,而不仅仅是这样。因此,如果你有一个页面,或者以后添加一个页面,那么URL/blah/en/feed cats是不允许的,没有用户代理。如果你不想使用=,你应该使用^/en/feed$,但等号在易读性方面更好。