簡體   English   中英

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;
}

但是,如果您有任何其他查詢 arguments,他們將失去此重定向規則。 要保留所有其他查詢 arguments 您可以執行以下操作:

if ($args ~ (.*)(^|&)lang=en(\2|$)&?(.*)) {
    set $args $1$3$4;
    return 301 /en$uri$is_args$args;
}

為了支持多種語言,我想到的第一個解決方案是

if ($args ~ (.*)(^|&)lang=([^&]*)(\2|$)&?(.*)) {
    set $args $1$4$5;
    return 301 /$3$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=[^&]*(\2|$)&?(.*)  $1$3$4;
    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|...)$    /$1;
}

更新

正如 OP 所述,當我們收到像example.com/de/some/path/?lang=en這樣的請求時,可能會有一個警告,該請求將被重定向到不存在的頁面example.com/en/de/some/path/ 為了避免這種情況,我們可以定義額外的map塊並從 URI 中去除語言前綴:

map $arg_lang $prefix {
    ~^(en|de|...)$    /$1;
}
map $args $stripped_args {
    # remove "lang" query argument if exists
    ~(.*)(^|&)lang=[^&]*(\2|$)&?(.*)  $1$3$4;
    default                           $args;
}
map $uri $stripped_uri {
    # remove language prefix from URI if one exists
    ~^/(en|de|...)(/.*)$  $2;
    default               $uri;
}
server {
    ...
    if ($prefix) {
        set $args $stripped_args;
        return 301 $prefix$stripped_uri$is_args$args;
    }
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM