htaccess命令只允许来自同一服务器的请求(不指定IP)

时间:2011-11-22 21:46:08

标签: php regex .htaccess variables

我想要实现的是使用htaccess仅允许来自同一服务器的请求,但是通过使用可用变量并且不指定IP来执行此操作。 目标是能够对相应文件夹中的文件运行cron作业和ajax请求,但如果尝试直接访问则返回404页面。

这是我到目前为止所拥有的:

Options -MultiViews +FollowSymLinks  
RewriteEngine On    
RewriteCond %{REMOTE_ADDR} !%{SERVER_ADDR}[NC]  
RewriteRule ^(.*)$ /error404.html [L,R=404]  

这适用于ajax。如果服务器恰好使用相同的传出IP,它也适用于cronjobs,但如果服务器的传出IP与站点的IP不同,显然它将失败并返回404,因为%{REMOTE_ADDR}与{{1}不同}}。 一种解决方案是查看该服务器的传出IP是什么,并将其添加为另一个例外。但是,我正在寻找一种更可重用的解决方案。我尝试使用正则表达式来匹配IP的第一部分,但我没有运气。真的不知道如何去做。基本上使用正则表达式我想要实现的是: 让我们假设:

%{SERVER_ADDR}

这是我需要找到有效比较表达式的2个变量。如果IP的第一部分相同,则该表达式将返回true。

另一种方法是指定允许的范围,但我不“知道”想要的范围是什么。我知道这是%{REMOTE_ADDR} = 192.322.122.50 %{SERVER_ADDR} = 192.322.122.1 变量的第一部分,但我不知道如何告诉服务器我的意思:D

希望我不会太困惑。最终我正在寻找的是一种确定请求是否来自与此网站相同的服务器的方法。它必须通过.htaccess文件来实现。为什么?因为受保护的文件夹还包含php脚本以外的文件,所以替代方案是动态地为所有这些文件提供服务,并在所有条件下使用PHP。使用普通的htaccess命令会更加优雅。我希望有办法做到这一点。

1 个答案:

答案 0 :(得分:2)

这未经过测试,但如果您愿意,可以尝试一下:

# note that this only works if both server and visitor are using IPv4 addresses
RewriteCond %{SERVER_ADDR} ^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$
RewriteCond %{REMOTE_ADDR} !^%1\.%2\.%3\.([0-9]{1,3})$
RewriteRule ^.*$ error404.html [R=404,L]

让我知道这种东西是否有效,但如果没有,请不要拍我:)