server{
listen 80;
listen [::]:80;
server_name 111.111.111.111 example.com www.example.com;
return 301 https://example.com$request_uri;
}
我没有安装任何额外的 NGINX 库。我的sites-available
默认配置中有上述服务器块,然后转到 HTTPS 服务器块。我想将加拿大访客重定向到example.ca
并将所有其他国家/地区重定向到example.com
。我已经走到这一步,但现在我不确定接下来该怎么做。
答案1
是的,这当然可以做到。我假设您已安装完整的 Nginx,并且 MAP 模块处于活动状态。
您将需要geoip-database
安装,在基于 RedHat 的系统上,使用 YUM 您将使用以下内容:
yum install geoip geoip-devel
因此,一旦安装了该程序,您将需要 MaxMind 的城市数据库,该数据库可从 MaxMind 的网站检索。
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz -O /usr/share/GeoIP/GeoLiteCity.dat.gz
gunzip /usr/share/GeoIP/GeoLiteCity.dat.gz
现在您已经完成了设置,可以开始配置 NGINX 了,这相对简单。
您的案例的示例配置将类似于以下内容:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
geoip_city /usr/share/GeoIP/GeoLiteCity.dat;
map $geoip_city_country_code $nearest_server {
default example.com;
CA example.ca;
}
server{
listen 80;
listen [::]:80;
server_name example.com
example.ca;
if ($nearest_server != $host) {
rewrite ^ $scheme://$nearest_server$request_uri break;
}
}
}
因此,具体来说:在上面的配置中,它确实取决于您的安装,因此您需要确保include、error_log和pid目录符合您的安装和偏好。
至于它的工作原理,我相信只要深入研究一下它就很容易理解了:
geoip_city /usr/share/GeoIP/GeoLiteCity.dat;
> 将下载的 MaxMind GeoIP 城市数据链接到 NGINX。
map $geoip_city_country_code $nearest_server {
default example.com;
CA example.ca;
}
以上部分链接了您的多个主机及其各自的国家代码,例如 CA 代表加拿大 - 您可以根据需要添加任意数量的条目。
if ($nearest_server != $host) {
rewrite ^ $scheme://$nearest_server$request_uri break;
}
上述部分根据位置决定使用哪个服务器,并传递请求 URI。例如,http://example.com/store.php
从加拿大 IP 请求将重定向到http://example.ca/store.php
差不多就是这样了,主要部分是 MAP 部分,以及服务器组件内的 IF 语句(以及满足要求)
希望这可以帮助。