【发布时间】: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 变量中提取它。这就是我的困境。
标签: php regex .htaccess variables