Nginx-基于地理位置返回

Nginx-基于地理位置返回

这是我的配置:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name test.com;

    ssl_certificate /etc/letsencrypt/test.com/fullchain.cer;
    ssl_certificate_key /etc/letsencrypt/test.com/test.com.key;
    include /etc/nginx/snippets/ssl-params.conf;


      if ($geoip2_data_country_iso_code = "FR") {
        return 301 https://test.com/fr$request_uri;
      }


    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:2368;

    }

    location ~ /.well-known {
        allow all;
    }

    client_max_body_size 50m;
}

我想要实现的是将法国用户重定向到 /fr 页面(保留整个原始路径名)。当然,这现在行不通。错误是“重定向次数过多”。任何其他用户都应该使用标准的 test.com 页面。

答案1

一个更简单的解决方案是使用负面前瞻

if ($geoip2_data_country_iso_code = "FR") {
    rewrite ^(?!/fr/) /fr$request_uri? permanent;
}

仅当当前请求 URI 尚未以前缀开头时,才会触发此重写规则/fr/

答案2

问题是一切都被重定向包括以以下网址开头的网址/fr例如

  1. https://example.com/something
  2. 301 https://example.com/fr/something
  3. 301 https://example.com/fr/fr/something
  4. 301 https://example.com/fr/fr/fr/something
  5. 301 https://example.com/fr/fr/fr/fr/something
  6. ...

你不应该把它放在if里面location,因为if 是邪恶的

Nginx 不支持内部包含多个 if 条件,也不支持&&语法。

您可以尝试用以下方法来规避这个问题:

set $redir "";

if ($geoip2_data_country_iso_code = "FR") {
    set $redir "fr";
}

if ($request_uri ~ ^/fr/) {
    set $redir "";
}

if ($redir = "fr") {
    return 301 https://example.com/fr$request_uri;
}

相关内容