我正在尝试在我的 apache2.conf 中的 Location 或 Directory 块中使用 apache IF ELSE 来限制一次访问所有虚拟主机中的所有文件和目录。
只允许美国和加拿大的用户访问任何内容。我安装了 MaxMind GeoIP2 模块和数据库,并且正确设置了环境变量。但是,我一定是误解了 SetEnvIf 或 If 是如何工作的。或者我在这里无法访问环境变量?
有人告诉我我做错了什么吗?
<IfModule mod_maxminddb.c>
MaxMindDBEnable On
MaxMindDBFile COUNTRY_DB /var/lib/GeoIP/GeoIP2-Country.mmdb
MaxMindDBFile CITY_DB /var/lib/GeoIP/GeoLite2-City.mmdb
MaxMindDBEnv COUNTRY_CODE COUNTRY_DB/country/iso_code
MaxMindDBEnv COUNTRY_NAME CITY_DB/country/names/en
MaxMindDBEnv CITY_NAME CITY_DB/city/names/en
MaxMindDBEnv REGION_CODE CITY_DB/subdivisions/0/iso_code
</IfModule>
<Location />
SetEnvIf COUNTRY_CODE ^(US|CA) AllowCountry
<If "-T env('AllowCountry')">
Require all granted
</If>
<Else>
Require all denied
</Else>
</Location>
试试这个……
SetEnvIf COUNTRY_CODE ^(US|CA) AllowCountry=1
<If "reqenv('AllowCountry') == '1'">
或者为什么不跳过 SetEnvIf 而只做……
<If "reqenv('COUNTRY_CODE') =~ /^(US|CA)/">
未经测试。如果需要调整,很高兴更新。希望你明白了 - 将环境变量 设置为 并明确检查它或直接在条件中检查 COUNTRY_CODE 环境变量。
还有这个可能值得注意……
环境变量排序 在某个条件下查找环境变量时,重要的是要考虑此解决方案在请求处理中有多早发生。作为准则,在虚拟主机上下文(目录、位置、htaccess)之外定义的任何指令不太可能有机会执行。虚拟主机范围内的 SetEnvIf 是在此解析之前运行的一个指令
当在外部使用 reqenv 时,解析通常会稍后发生,但确切的时间取决于表达式在其中使用的指令。
希望有帮助。