Apache-2.2

使用 mod_rewrite 在 apache 中按模式阻止來自機器人的請求。mod_rewrite 不工作

  • February 14, 2021

我正在嘗試通過glitter_calendarapache 上的模式阻止來自機器人的請求。

**史前史。**我的伺服器被機器人大量訪問。請求 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>

發現了類似的問題。連結:

我的 mod 重寫似乎不起作用。我在wordpress中找不到錯誤404,而不是通過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>
<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 在pattern中檢查 URL 效率更高,這裡不需要額外的RewriteCond指令。並且不需要所有擷取組(您的初始指令中有 4 個擷取組,這只是不必要的資源浪費)。使用標誌L時不需要(實際上是隱含的)。F``L

NC如果您特別需要阻止GliTTer_CALendarGLITTER_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)。

引用自:https://serverfault.com/questions/829260