这是我的配置:
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
例如
https://example.com/something
301 https://example.com/fr/something
301 https://example.com/fr/fr/something
301 https://example.com/fr/fr/fr/something
301 https://example.com/fr/fr/fr/fr/something
- ...
你不应该把它放在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;
}