我正在尝试根据用户的国家/地区将用户重定向到子文件夹,并限制访问其他国家/地区的网站版本。我正在使用Apache的GeoIP模块,访问者的IP地址和maxmind数据库来确定访问者的国家。
我在example.com的根目录中有一个.htaccess
文件,其中包含:
# US
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US$
RewriteRule ^(.*)$ https://example.com/us$1 [L]
# UK
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^UK$
RewriteRule ^(.*)$ https://example.com/uk$1 [L]
这很好用。来自美国的访问者被重定向到us子文件夹,英国访问者被重定向。但是,美国访问者可以直接访问example.com/uk
并查看其他国家/地区的版本,我想阻止此操作,但我的尝试失败了。
我将上面的重写规则复制到子文件夹中的.htaccess
个文件中,这导致我访问example.com时出现了重定向循环。
作为临时解决方案,我使用以下内容,只允许来自获批准访问子文件夹的国家/地区进行访问,并为外国访问者发送HTTP 403,但不符合我的要求。
GeoIPEnable On
SetEnvIf GEOIP_COUNTRY_CODE US AllowCountry
SetEnvIf GEOIP_COUNTRY_CODE CA AllowCountry
Deny from all
Allow from env=AllowCountry
感谢任何帮助。
答案 0 :(得分:-1)
我想出来了。解决方案是,在重定向到国家/地区的子文件夹后,不会重定向来自该国家/地区的访问。我会解释一下。
以下规则将用户重定向到example.com/us
# US
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US$
RewriteRule ^(.*)$ https://example.com/us$1 [L]
一旦发生此重定向,您就不应该在us子文件夹的.htaccess
文件中重复使用此规则,否则将导致重定向循环。您可以包含其他国家/地区的规则以强制它们返回其国家/地区的子文件夹,但不要在其子文件夹中包含该国家/地区的重定向规则(在本例中为美国)。
<强> /var/www/example.com/.htaccess 强>
# US
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US$
RewriteRule ^(.*)$ https://example.com/us$1 [L]
# UK
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^UK$
RewriteRule ^(.*)$ https://example.com/uk$1 [L]
<强> /var/www/example.com/us/.htaccess 强>
# UK
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^UK$
RewriteRule ^(.*)$ https://example.com/uk$1 [L]
我希望这有帮助!