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

标签 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}不同于 %{SERVER_ADDR}。 一种解决方案是查看该服务器的传出 IP 是什么,并将其添加为另一个异常(exception)。但是,我正在寻找更可重用的解决方案。我尝试使用正则表达式来匹配 IP 的第一部分,但我没有运气。真的不知道该怎么做。基本上使用正则表达式我想要实现的是: 让我们假设:

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

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

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

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

最佳答案

这还没有经过测试,但如果你愿意,你可以试一试:

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

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

关于php - htaccess 命令只允许来自同一服务器的请求(不指定 IP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8234258/

相关文章:

php - 法语编码字符

javascript - 使用jquery和php将canvas作为图像保存到数据库中

javascript - 正则表达式仅在 Safari 上失败

regex - 使用 sed 删除子字符串

apache - htaccess 不会重写子域

.htaccess - 拒绝来自除一个域之外的所有域的推荐

php - 使用数组合并到 foreach 循环中

关于扩展类的PHP继承问题

javascript - 与 IP 地址匹配的动态 AngularJS 验证,但最后一个八位字节在特定范围内

.htaccess - 如何在多个目录级别上进行动态 .htaccess 重定向