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