已加入白名单但Crontab仍被.htaccess拦截的问题求助
问题
我想限制仅自己的IP和服务器IP可访问script.php和script2.php两个脚本,已经在.htaccess中加入服务器IP白名单,但通过Crontab运行脚本时出现403 Forbidden错误,手动从自身IP访问则正常。
当前配置
.htaccess 配置
Options +FollowSymlinks RewriteEngine on #the urls that should be checked RewriteCond %{REQUEST_URI} ^(/script.php|/script2.php).*$ RewriteCond %{REMOTE_ADDR} !=194.1....(My server Ip) RewriteCond %{REMOTE_ADDR} !=0.0.0.0 RewriteCond %{REMOTE_ADDR} !=127.0.0.1 RewriteCond %{REMOTE_ADDR} !=172......(My Ip) RewriteRule ^.*$ / [F]
Crontab 配置(Hostinger面板)
wget -O /dev/null mydomain.com/script.php/
错误信息
--2022-07-15 09:30:02-- mydomain.com/script.php Resolving mydomain.com (mydomain.com)... 2a02:4780:b....., 194.1....(my server ip) Connecting to mydomain.com(mydomain.com)|2a02:4780:b:....|:80... connected. HTTP request sent, awaiting response... 403 Forbidden 2022-07-15 09:30:02 ERROR 403: Forbidden.
解决方案
问题根源
从错误日志可见,wget解析域名时同时获取到IPv6和IPv4地址,且优先使用IPv6地址连接服务器,但你的.htaccess仅添加了服务器的IPv4地址到白名单,导致请求的REMOTE_ADDR是未被允许的IPv6地址,触发403拦截规则。
解决办法
方法1:添加服务器IPv6地址到白名单
在.htaccess中新增一条针对服务器IPv6地址的规则:
RewriteCond %{REMOTE_ADDR} !=2a02:4780:b.....(服务器的IPv6地址)
修改后的完整规则:
Options +FollowSymlinks RewriteEngine on #the urls that should be checked RewriteCond %{REQUEST_URI} ^(/script.php|/script2.php).*$ RewriteCond %{REMOTE_ADDR} !=194.1....(My server Ip) RewriteCond %{REMOTE_ADDR} !=2a02:4780:b.....(服务器的IPv6地址) RewriteCond %{REMOTE_ADDR} !=0.0.0.0 RewriteCond %{REMOTE_ADDR} !=127.0.0.1 RewriteCond %{REMOTE_ADDR} !=172......(My Ip) RewriteRule ^.*$ / [F]
方法2:强制wget使用IPv4连接
修改Crontab命令,添加-4参数强制wget用IPv4访问,此时请求的REMOTE_ADDR就是你已配置的服务器IPv4地址:
wget -4 -O /dev/null mydomain.com/script.php/
方法3:直接用本地回环地址访问(推荐)
直接通过127.0.0.1访问脚本,本地请求的REMOTE_ADDR是127.0.0.1,已在你的白名单中,无需额外配置,还能避免域名解析的开销:
wget -O /dev/null http://127.0.0.1/script.php/
如果脚本依赖域名环境,可在请求头中添加Host参数:
wget -O /dev/null --header="Host: mydomain.com" http://127.0.0.1/script.php/
内容的提问来源于stack exchange,提问作者Lucas Ln
相关产品推荐
相关产品推荐

