我正在尝试通过glitter_calendar
apache 上的模式阻止来自机器人的请求。
史前史。我的服务器被大量机器人访问。请求 URI 是 ...glitter_calendar.。wordpress 返回 404。服务器甚至每周停机一次。我尝试使用 Fail2ban 阻止它们。没有成功。服务器负载没有下降,我的 iptables 阻止规则中不断出现新主机。
我正在尝试通过模式.htaccess
添加一个块规则glitter_calendar
:
# 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
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*(wpdffcontent)|(glitter_calendar)|(mp4:).* [NC]
RewriteRule ^(.*)$ - [F,L]
</IfModule>
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
找到了类似的问题。链接:
- https://stackoverflow.com/questions/4640807/how-to-block-bot-requests-to-urls-that-match-a-common-pattern-in-apache/4640865#4640865
- https://perishablepress.com/eight-ways-to-blacklist-with-apaches-mod_rewrite/
我的 mod 重写似乎不起作用。我明白了未找到错误404在 wordpress 内部,而不是通过 apache。
模块 mod_rewrite 已开启:
# httpd -M
...
Loaded Modules:
...
rewrite_module (shared)
...
虚拟主机配置由 virtualmin 管理。如何修复此问题?
部分httpd.conf
:
...
LoadModule rewrite_module modules/mod_rewrite.so
...
<VirtualHost x.x.x.x]:80>
SuexecUserGroup "#505" "#504"
ServerName example.com
ServerAlias www.example.com
ServerAlias webmail.example.com
ServerAlias admin.example.com
ServerAlias autoconfig.example.com
ServerAlias autodiscover.example.com
DocumentRoot /home/example/public_html
ErrorLog /var/log/virtualmin/example.com_error_log
CustomLog /var/log/virtualmin/example.com_access_log combined
ScriptAlias /cgi-bin/ /home/example/cgi-bin/
ScriptAlias /awstats/ /home/example/cgi-bin/
ScriptAlias /AutoDiscover/AutoDiscover.xml /home/example/cgi-bin/autoconfig.cgi
ScriptAlias /Autodiscover/Autodiscover.xml /home/example/cgi-bin/autoconfig.cgi
ScriptAlias /autodiscover/autodiscover.xml /home/example/cgi-bin/autoconfig.cgi
DirectoryIndex index.html index.htm index.php index.php4 index.php5
<Directory /home/example/public_html>
Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch +ExecCGI
allow from all
AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
AddType application/x-httpd-php .php
AddHandler fcgid-script .php
AddHandler fcgid-script .php5
FCGIWrapper /home/example/fcgi-bin/php5.fcgi .php
FCGIWrapper /home/example/fcgi-bin/php5.fcgi .php5
</Directory>
<Directory /home/example/cgi-bin>
allow from all
AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
</Directory>
RewriteEngine on
RewriteCond %{HTTP_HOST} =webmail.example.com
RewriteRule ^(.*) https://example.com:20000/ [R]
RewriteCond %{HTTP_HOST} =admin.example.com
RewriteRule ^(.*) https://example.com:10000/ [R]
RemoveHandler .php
RemoveHandler .php5
php_admin_value engine Off
FcgidMaxRequestLen 1073741824
Alias /dav /home/example/public_html
Alias /pipermail /var/lib/mailman/archives/public
<Location /dav>
DAV on
AuthType Basic
AuthName "example.com"
AuthUserFile /home/example/etc/dav.digest.passwd
Require valid-user
ForceType text/plain
Satisfy All
RemoveHandler .php
RemoveHandler .php5
RewriteEngine off
</Location>
<Files awstats.pl>
AuthName "example.com statistics"
AuthType Basic
AuthUserFile /home/example/.awstats-htpasswd
require valid-user
</Files>
RedirectMatch /cgi-bin/mailman/([^/\.]*)(.cgi)?(.*) https://example.com:10000/virtualmin-mailman/unauthenticated/$1.cgi$3
RedirectMatch /mailman/([^/\.]*)(.cgi)?(.*) https://example.com:10000/virtualmin-mailman/unauthenticated/$1.cgi$3
php_value memory_limit 32M
IPCCommTimeout 41
Redirect /mail/config-v1.1.xml /cgi-bin/autoconfig.cgi
Redirect /.well-known/autoconfig/mail/config-v1.1.xml /cgi-bin/autoconfig.cgi
</VirtualHost>
答案1
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{THE_REQUEST} ^.*(wpdffcontent)|(glitter_calendar)|(mp4:).* [NC] RewriteRule ^(.*)$ - [F,L] </IfModule>
这需要前您现有的 WordPress mod_rewrite 指令,否则它将永远不会被处理。(WordPress前端控制器在您的指令有机会运行之前重写每个请求。)但是,您的指令应该写成一行:
RewriteRule (?:wpdffcontent|glitter_calendar|mp4:) - [F]
不需要<IfModule>
包装器(事实上,应该省略)。RewriteEngine On
只需要在文件中出现一次(任何地方)。在RewriteRule
图案,这里不需要额外的RewriteCond
指令。也不需要所有的捕获组(初始指令中有 4 个捕获组,这只会浪费不必要的资源)。L
使用标志时不需要F
(L
实际上默示)。
NC
仅当您特别需要阻止GliTTer_CALendar
以及GLITTER_calendar
等时才包含标志glitter_calendar
。如果所有请求都是glitter_calendar
(全部小写),那么这就是您需要阻止的全部。
但是,我认为最好结合使用 mod_setenvif 和 mod_authz_host (Apache 2.2) 来阻止这些请求。(如果您有.htaccess
使用 mod_rewrite 的其他文件,则可以覆盖使用 mod_rewrite 的阻止。)
例如:
SetEnvIf Request_URI "(?:wpdffcontent|glitter_calendar|mp4:)" blockit
Order Deny,Allow
Deny from env=blockit
从逻辑上讲,任何阻塞指令应该是文件中的第一项.htaccess
。其次是规范/外部重定向,然后是内部重写(原始 WordPress 指令)。但是,如果您有权访问服务器配置(您似乎有),那么这些都应该进入您的服务器配置并禁用.htaccess
(即AllowOverride None
)。