使用 mod_rewrite 在 apache 中按模式阻止來自機器人的請求。mod_rewrite 不工作
我正在嘗試通過
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 重寫似乎不起作用。我在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_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
)。