根据国家/地区重定向访问者

时间:2018-01-26 18:03:30

标签: apache .htaccess redirect mod-rewrite

我正在尝试根据用户的国家/地区将用户重定向到子文件夹,并限制访问其他国家/地区的网站版本。我正在使用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

感谢任何帮助。

1 个答案:

答案 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]

我希望这有帮助!