On 20.06.2019 2:33, Evgeniy Berdnikov wrote:

  IMHO, лучше было бы принять соглашение, что rewrite работает на уровне
  раскодированных URI и его результат подлежит кодированию.
  Для вставки уже кодированных строк понадобится функция декодирования,
  зато схема будет простой и предельно ясной.

Ваше предложение сломает обратную совместимость и огромное количество корректно работающих в данный момент конфигураций. Не надо так делать.

Кроме того, процесс раскодирования сопровождается потерей информации,
так что в результате потом невозможно будет корректно закодировать урл.

Например, в этом коде найдете ошибку?

============================================================

Файл conf.d/example.com.js:

function encoded_title(r) {
    return encodeURIComponent(r.variables.title);
}

Файл conf.d/example.com.conf:

js_include conf.d/example.com.js;
js_set $encoded_title encoded_title;

location ~ ^/wiki/(?<title>.*) {
    return 301 https://$host/$encoded_title$is_args$args;
}

============================================================

Ошибка в том, что /wiki/some/other/uri
превращается в /some%2Fother%2Furi

также /wiki/User:Example
превращается в /User%3AExample

Корректно работать будет только такой код:

============================================================

Файл conf.d/example.com.js:

function request_uri_without_wiki_prefix(r) {
    var request_uri = r.variables.request_uri;
    if (request_uri.startsWith('/wiki/')) {
        return request_uri.substring(5);
    } else {
        r.error('unexpected request_uri: ' + request_uri)
        return request_uri;
    }
}

Файл conf.d/example.com.conf:

js_include conf.d/example.com.js;
js_set $request_uri_without_wiki_prefix request_uri_without_wiki_prefix;

location /wiki/ {
    return 301 https://$host$request_uri_without_wiki_prefix;
}

============================================================

Или тот вариант конфигурации, который предлагает Максим:

location /wiki/ {
    rewrite ^/wiki/(.*) https://$host/$1 permanent;
}

--
Best regards,
 Gena

_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Ответить