You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RewriteMap调用Shell脚本实现IP封禁失效,请求协助排查

问题:RewriteMap调用Shell脚本实现IP封禁失效排查

我参考相关IP封禁方案实现后功能未生效,以下是我的配置和测试脚本,请求协助排查需要补充的配置:

测试用Shell脚本(filterip.sh)

#!/bin/bash
echo "deny"

.htaccess配置

RewriteEngine on
RewriteCond ${filterip:%{HTTP:X-FORWARDED-FOR}} deny [NC]
RewriteRule ^ - [L,F]

Vhost配置

RewriteMap filterip prg:/path/filterip.sh

说明:已为Shell脚本赋予执行权限,但功能仍未生效。


排查要点
  • 确认RewriteMap配置加载:RewriteMap只能放在服务器主配置(httpd.conf)或虚拟主机(vhost)文件中,你已放在vhost是正确的,但需确保配置文件已被Apache加载,且修改后重启过Apache服务。
  • 检查权限链完整性:确保Apache运行用户(通常为www-data、apache或httpd)对脚本所在的所有上级目录有访问权限(即x权限),同时对脚本本身有r和x权限。可通过chown apache:apache /path/filterip.sh和chmod 755 /path/filterip.sh调整,再检查上级目录权限。
  • 修复脚本STDIN处理逻辑:PRG类型的RewriteMap会将请求参数(此处为X-FORWARDED-FOR的值)通过标准输入传给脚本,你的测试脚本未读取STDIN,虽理论上应封禁所有请求,但可能因输入处理异常导致失效。修改脚本如下测试:
    #!/bin/bash
    read ip  # 读取Apache传入的IP
    echo "deny"
    
  • 验证依赖模块启用:确保mod_rewrite和mod_cgi(或mod_cgid)模块已启用。可执行apache2ctl -M(Debian/Ubuntu)或httpd -M(RHEL/CentOS)查看模块列表,未启用则通过a2enmod rewrite cgi(Debian/Ubuntu)或修改httpd.conf加载模块。
  • 测试真实客户端IP变量:若服务器未经过反向代理,HTTP:X-FORWARDED-FOR可能为空,导致RewriteCond不匹配。临时替换为%{REMOTE_ADDR}验证功能:
    RewriteCond ${filterip:%{REMOTE_ADDR}} deny [NC]
    
  • 查看Apache错误日志:检查错误日志(路径通常为/var/log/apache2/error.log或/var/log/httpd/error_log),日志中会明确记录RewriteMap执行失败的原因,如路径错误、权限不足、模块缺失等。
  • 修正脚本换行符:若脚本在Windows环境编辑,可能存在DOS换行符(\r\n)导致Apache执行报错。使用dos2unix /path/filterip.sh转换为Unix换行符。
  • 解除SELinux限制:若服务器启用SELinux,可能阻止Apache执行脚本。临时执行setenforce 0关闭SELinux测试,若生效则配置永久规则:
    chcon -t httpd_sys_script_exec_t /path/filterip.sh
    

内容的提问来源于stack exchange,提问作者Vivek Bansal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:48:11