2011-11-22 81 views
4

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

这是我到目前为止有:

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

这工作得很好了阿贾克斯。它也适用于cronjobs,如果服务器碰巧使用相同的外出IP,但是如果服务器的外出IP与站点的IP不同,显然它将失败并返回404,因为%{REMOTE_ADDR}%{SERVER_ADDR}不同。 一个解决方案是查看该服务器的传出IP,并将其添加为另一个异常。不过,我正在寻找更可重用的解决方案。我试图使用正则表达式来匹配IP的第一部分,但我没有这样的运气。真的不知道如何去做这件事。基本上与正则表达式我想要实现的是: 假设:

%{REMOTE_ADDR} = 192.322.122.50 
%{SERVER_ADDR} = 192.322.122.1 

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

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

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

+0

你可能做的最好的事情是匹配子网(像前3个字节),但不是像1-50这样的任意范围。 –

+0

是匹配子网是我想要做的。我想另一种方式来说这是..你如何写条件,所以它只允许来自同一子网的请求? 而1-50只是一个例子。以及知识产权。我试图使代码完全动态,所以换句话说,子网不能从字面上指定,但它必须以某种方式从SERVER_ADDR变量中提取。这是我的困境。 – Owbey

回答

1

这不是测试,但你可以给它一个尝试,如果你想:

# 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] 

让我知道,如果这种东西的工作,但如果它不不要拍我: )

+0

现在测试出来... – Owbey

+0

好吧,但我得到了一些意想不到的结果。意外,因为在奇怪。感谢您的输入。据我了解,您的代码应该从SERVER_ADDR中捕获每个字节,然后使用前3个字节与REMOTE_ADDR进行匹配。理论上这应该起作用,我想不出另一种方式去解决这个问题,但鉴于我没有得到预期的响应,我认为代码本身可能需要一些调整。我会继续努力.. – Owbey

+0

这不适合我。我不认为%1等也扩展了。 – reinierpost

相关问题