Re: location + rewrite и (де)кодирование URI

Gena Makhomed gmm на csdoc.com
Чт Июн 20 04:24:37 UTC 2019


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