NGINX 301 使用查询参数值重定向
NGINX 301 redirect using query argument value
我想将 example.com/?lang=en 重定向到 example.com/en/.
我正在使用 Python Django 和我的服务器 运行 Plesk / Nginx。
我尝试像这样在我的网页上重定向。但它不起作用;
rewrite ^/?lang=en$ /en/ redirect;
但是如果我删除问号重写就可以了。
我试了很多方法都找不到解决办法
谢谢。
最简单的就是
if ($arg_lang = en) {
return 301 /en$uri;
}
但是,如果您有任何其他查询参数,它们将因该重定向规则而丢失。要保留所有其他查询参数,您可以执行以下操作:
if ($args ~ (.*)(^|&)lang=en(|$)&?(.*)) {
set $args ;
return 301 /en$uri$is_args$args;
}
要支持多种语言,第一个想到的解决方案是
if ($args ~ (.*)(^|&)lang=([^&]*)(|$)&?(.*)) {
set $args ;
return 301 /$uri$is_args$args;
}
但是,如果您有一些格式错误的 lang
查询参数值,它会导致重定向到不存在的页面。要仅为支持的语言过滤 lang
值,您可以使用 map
指令:
map $arg_lang $prefix {
en /en;
de /de;
...
# if none matched, value of $prefix variable would be an empty string
}
map $args $stripped_args {
# remove "lang" query argument if exists
~(.*)(^|&)lang=[^&]*(|$)&?(.*) ;
default $args;
}
server {
...
if ($prefix) {
set $args $stripped_args;
return 301 $prefix$uri$is_args$args;
}
...
}
如果您的 URI 语言前缀与 lang
查询参数值相同(或者可以通过某些正则表达式从中派生),则可以简化第一个 map
块:
map $arg_lang $prefix {
~^(en|de|...)$ /;
}
更新
正如 OP 所述,当我们收到像 example.com/de/some/path/?lang=en
这样的请求时,可能会有一个警告,该请求将被重定向到不存在的页面 example.com/en/de/some/path/
。为了避免它,我们可以定义额外的 map
块并从 URI 中删除语言前缀:
map $arg_lang $prefix {
~^(en|de|...)$ /;
}
map $args $stripped_args {
# remove "lang" query argument if exists
~(.*)(^|&)lang=[^&]*(|$)&?(.*) ;
default $args;
}
map $uri $stripped_uri {
# remove language prefix from URI if one exists
~^/(en|de|...)(/.*)$ ;
default $uri;
}
server {
...
if ($prefix) {
set $args $stripped_args;
return 301 $prefix$stripped_uri$is_args$args;
}
...
}
我想将 example.com/?lang=en 重定向到 example.com/en/.
我正在使用 Python Django 和我的服务器 运行 Plesk / Nginx。
我尝试像这样在我的网页上重定向。但它不起作用;
rewrite ^/?lang=en$ /en/ redirect;
但是如果我删除问号重写就可以了。
我试了很多方法都找不到解决办法
谢谢。
最简单的就是
if ($arg_lang = en) {
return 301 /en$uri;
}
但是,如果您有任何其他查询参数,它们将因该重定向规则而丢失。要保留所有其他查询参数,您可以执行以下操作:
if ($args ~ (.*)(^|&)lang=en(|$)&?(.*)) {
set $args ;
return 301 /en$uri$is_args$args;
}
要支持多种语言,第一个想到的解决方案是
if ($args ~ (.*)(^|&)lang=([^&]*)(|$)&?(.*)) {
set $args ;
return 301 /$uri$is_args$args;
}
但是,如果您有一些格式错误的 lang
查询参数值,它会导致重定向到不存在的页面。要仅为支持的语言过滤 lang
值,您可以使用 map
指令:
map $arg_lang $prefix {
en /en;
de /de;
...
# if none matched, value of $prefix variable would be an empty string
}
map $args $stripped_args {
# remove "lang" query argument if exists
~(.*)(^|&)lang=[^&]*(|$)&?(.*) ;
default $args;
}
server {
...
if ($prefix) {
set $args $stripped_args;
return 301 $prefix$uri$is_args$args;
}
...
}
如果您的 URI 语言前缀与 lang
查询参数值相同(或者可以通过某些正则表达式从中派生),则可以简化第一个 map
块:
map $arg_lang $prefix {
~^(en|de|...)$ /;
}
更新
正如 OP 所述,当我们收到像 example.com/de/some/path/?lang=en
这样的请求时,可能会有一个警告,该请求将被重定向到不存在的页面 example.com/en/de/some/path/
。为了避免它,我们可以定义额外的 map
块并从 URI 中删除语言前缀:
map $arg_lang $prefix {
~^(en|de|...)$ /;
}
map $args $stripped_args {
# remove "lang" query argument if exists
~(.*)(^|&)lang=[^&]*(|$)&?(.*) ;
default $args;
}
map $uri $stripped_uri {
# remove language prefix from URI if one exists
~^/(en|de|...)(/.*)$ ;
default $uri;
}
server {
...
if ($prefix) {
set $args $stripped_args;
return 301 $prefix$stripped_uri$is_args$args;
}
...
}