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

Posted

技术标签:

【中文标题】htaccess 命令仅允许来自同一服务器的请求(不指定 IP)【英文标题】:htaccess command to only allow requests from same server (without specifying the IP) 【发布时间】:2012-01-04 06:38:44 【问题描述】:

我想要实现的是使用 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 并将其添加为另一个例外。但是我正在寻找一个更可重用的解决方案。我尝试使用正则表达式仅匹配 IP 的第一部分,但我没有运气。真的不知道该怎么做。基本上使用正则表达式,我想要实现的是: 让我们假设:

%REMOTE_ADDR = 192.322.122.50  
%SERVER_ADDR = 192.322.122.1  

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

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

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

【问题讨论】:

你可能做的最好的事情是匹配子网(比如前 3 个字节),而不是像 1-50 这样的任意范围。 是的,匹配子网是我想要做的。我想另一种说法是......你如何编写条件以便它只允许来自同一子网的请求? 1-50 只是一个例子。以及IP的。我正在尝试使代码完全动态化,因此无法从字面上指定子网,但必须以某种方式从 SERVER_ADDR 变量中提取它。这就是我的困境。 【参考方案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]

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

【讨论】:

好的,但我得到了一些意想不到的结果。出乎意料的诡异。感谢您的输入。据我了解,您的代码应该从 SERVER_ADDR 中捕获每个字节,然后使用前 3 个字节与 REMOTE_ADDR 匹配。理论上这应该可行,我想不出另一种方法来解决这个问题,但鉴于我没有得到预期的响应,我认为代码本身可能需要一些调整。我会继续努力的。。 这对我不起作用。我也不认为 %1 等被扩展了。

以上是关于htaccess 命令仅允许来自同一服务器的请求(不指定 IP)的主要内容,如果未能解决你的问题,请参考以下文章

使服务器应用程序仅接受来自同一主机中客户端应用程序的请求

如何配置 Apache2 以允许来自同一 IP 地址的多个同时连接?

重定向来自特定域的所有请求

.htaccess:无效命令“允许”,可能拼写错误或由未包含在服务器配置中的模块定义

.htaccess-仅允许从某些IP和IP范围进行访问

如何限制 dnsmasq 仅回复特定的客户端 DNS 请求?