Php htaccess命令仅允许来自同一服务器的请求(不指定IP)
我试图实现的是使用htaccess只允许来自同一台服务器的请求,但是通过使用可用变量而不是指定IP来实现。 目标是能够对相应文件夹中的文件运行cron作业和ajax请求,但如果尝试直接访问,则返回404页 以下是我目前掌握的情况:Php htaccess命令仅允许来自同一服务器的请求(不指定IP),php,regex,.htaccess,variables,Php,Regex,.htaccess,Variables,我试图实现的是使用htaccess只允许来自同一台服务器的请求,但是通过使用可用变量而不是指定IP来实现。 目标是能够对相应文件夹中的文件运行cron作业和ajax请求,但如果尝试直接访问,则返回404页 以下是我目前掌握的情况: Options -MultiViews +FollowSymLinks RewriteEngine On RewriteCond %{REMOTE_ADDR} !%{SERVER_ADDR}[NC] RewriteRule ^(.*)$ /error4
Options -MultiViews +FollowSymLinks
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !%{SERVER_ADDR}[NC]
RewriteRule ^(.*)$ /error404.html [L,R=404]
这对于ajax很好。如果服务器恰好使用相同的传出IP,它也适用于cronjobs,但是如果服务器的传出IP与站点的IP不同,显然它将失败并返回404,因为%{REMOTE\u ADDR}
与%{server\u ADDR}
不同。
一种解决方案是查看该服务器的传出IP是什么,并将其添加为另一个异常。然而,我正在寻找一个更可重用的解决方案。我尝试使用正则表达式只匹配IP的第一部分,但我没有运气。我真的不知道该怎么做。基本上,对于regex,我试图实现以下目标:
让我们假设:
%{REMOTE_ADDR} = 192.322.122.50
%{SERVER_ADDR} = 192.322.122.1
这是我需要找到有效比较表达式的两个变量。如果IP的第一部分相同,则此表达式将返回true
另一种方法是指定允许的范围,但我不“知道”想要的范围是什么。我知道如果SERVER\u ADDR
变量是第一部分,但我不知道如何告诉服务器我的意思:D
希望我没有太困惑。最终,我要寻找的是一种确定请求是否来自与该站点相同的服务器的方法。它必须通过.htaccess文件实现。为什么?因为受保护的文件夹还包含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]
让我知道这类东西是否有效,但如果不起作用,请不要开枪:)您可能能做的最好是匹配子网(如前3个字节),但不要匹配任意范围(如1-50)。是的,匹配子网是我正在尝试做的。我想另一种说法是。。如何编写条件,使其只允许来自同一子网的请求?1-50只是一个例子。以及知识产权。我试图使代码完全动态,因此换句话说,子网不能按字面意思指定,但它必须以某种方式从SERVER\u ADDR变量中提取。这就是我的困境。好吧,我试过了,但我得到了一些意想不到的结果。出人意料的,奇怪的。谢谢你的意见。据我所知,您的代码应该捕获服务器\u ADDR中的每个字节,然后使用前3个字节与远程\u ADDR进行匹配。从理论上讲,这应该是可行的,我想不出其他方法来解决这个问题,但鉴于我没有得到预期的响应,我认为代码本身可能需要一些调整。我会继续努力的这对我不管用。我认为%1等也没有扩展。