Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php htaccess命令仅允许来自同一服务器的请求(不指定IP)_Php_Regex_.htaccess_Variables - Fatal编程技术网

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

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

我试图实现的是使用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\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等也没有扩展。