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

2019-06-18 Пенетрантность Gena Makhomed

On 18.06.2019 15:26, Maxim Dounin wrote:


И снова эксперимент плохой, негодный.


Вот полный конфиг тестового сервера:

server {
listen 8080;

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

location /wiki2/ {
rewrite ^/wiki2/(?.*) https://$host/$title;
}
}

Вот запросы к первому и второму location`у:

$ curl -I http://127.0.0.1:8080/wiki1/%D1%82%D0%B5%D1%81%D1%82
Location: https://127.0.0.1/%D1%82%D0%B5%D1%81%D1%82

$ curl -I http://127.0.0.1:8080/wiki2/%D1%82%D0%B5%D1%81%D1%82
Location: https://127.0.0.1/тест

Первый и второй location отличаются между собой только тем,
что в первом используется неименованное выделение $1,
а во втором - именованное выделение $title.

И в то же время получаем такие разные результаты. Почему так?

Ведь с точки зрения пользователя и с точки зрения документации nginx
эти два location`а полностью идентичны по своему смыслу и поведению.

--
Best regards,
 Gena

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

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

2019-06-18 Пенетрантность Maxim Dounin
Hello!

On Tue, Jun 18, 2019 at 03:12:12PM +0300, Gena Makhomed wrote:

> On 18.06.2019 14:09, Maxim Dounin wrote:
> 
> > Проще всего сделать так:
> > 
> >  rewrite ^/wiki/(.*) https://$host/$1;
> 
> в таком случае в редиректе возвращается раскодированный урл:
> 
> $ curl -I https://example.com/wiki/%D1%82%D0%B5%D1%81%D1%82
> HTTP/1.1 301 Moved Permanently
> Location: https://example.com/тест

И снова эксперимент плохой, негодный.

$ curl -vvv http://127.0.0.1:8080/wiki/%d1%82%d0%b5%d1%81%d1%82
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /wiki/%d1%82%d0%b5%d1%81%d1%82 HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.62.0
> Accept: */*
> 
< HTTP/1.1 302 Moved Temporarily
< Server: nginx/1.17.1
< Date: Tue, 18 Jun 2019 12:24:39 GMT
< Content-Type: text/html
< Content-Length: 145
< Connection: keep-alive
< Location: https://127.0.0.1/%D1%82%D0%B5%D1%81%D1%82
< 

302 Found

302 Found
nginx/1.17.1


* Connection #0 to host 127.0.0.1 left intact

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

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

2019-06-18 Пенетрантность Gena Makhomed

On 18.06.2019 14:09, Maxim Dounin wrote:


Проще всего сделать так:

 rewrite ^/wiki/(.*) https://$host/$1;


в таком случае в редиректе возвращается раскодированный урл:

$ curl -I https://example.com/wiki/%D1%82%D0%B5%D1%81%D1%82
HTTP/1.1 301 Moved Permanently
Location: https://example.com/тест

Более многословный вариант редиректа работает корректно,
так как и ожидается от него в соответствии с RFC 3986:

# curl -I https://example.com/wiki/%D1%82%D0%B5%D1%81%D1%82
HTTP/1.1 301 Moved Permanently
Location: https://example.com/%D1%82%D0%B5%D1%81%D1%82

Конфиг, который работает корректно:

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

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

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

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

server {
 location ~ ^/wiki/(?.*) {
return 301 https://$host/$title_encodeURIComponent$is_args$args;
 }
}

--
Best regards,
 Gena

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

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

2019-06-18 Пенетрантность Maxim Dounin
Hello!

On Tue, Jun 18, 2019 at 01:27:36PM +0300, Gena Makhomed wrote:

> On 18.06.2019 11:27, Maxim Dounin wrote:
> 
> >> Есть такой фрагмент документации на директиву location:
> >>
> >>   Синтаксис: location [ = | ~ | ~* | ^~ ] uri { ... }
> >>
> >>   Для сопоставления используется URI запроса в нормализованном виде,
> >>   после декодирования текста, заданного в виде “%XX”, преобразования
> >>   относительных элементов пути “.” и “..” в реальные и возможной
> >>   замены двух и более подряд идущих слэшей на один.
> 
> >> Есть такой фрагмент конфига:
> >>
> >>   location ~ ^/wiki/(?.*) {
> >>   return 301 https://$host/$title$is_args$args;
> >>   }
> >>
> 
> Получается, что в документации написано все правильно, приведенный
> фрагмент конфига содержит ошибку, и правильно будет переписать его
> таким образом:

[...]

> Только в этом случае поведение nginx будет полностью соответствовать
> RFC 3986 и более простого варианта решения этой задачи не существует?

Существует.  Проще всего сделать так:

rewrite ^/wiki/(.*) https://$host/$1;

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

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

2019-06-18 Пенетрантность Gena Makhomed

On 18.06.2019 11:27, Maxim Dounin wrote:


Есть такой фрагмент документации на директиву location:

  Синтаксис: location [ = | ~ | ~* | ^~ ] uri { ... }

  Для сопоставления используется URI запроса в нормализованном виде,
  после декодирования текста, заданного в виде “%XX”, преобразования
  относительных элементов пути “.” и “..” в реальные и возможной
  замены двух и более подряд идущих слэшей на один.



Есть такой фрагмент конфига:

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



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

==

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

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

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

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

server {
# ...
location ~ ^/wiki/(?.*) {
return 301 https://$host/$title_encodeURIComponent$is_args$args;
}
# ...
}

==

?

Только в этом случае поведение nginx будет полностью соответствовать
RFC 3986 и более простого варианта решения этой задачи не существует?

--
Best regards,
 Gena

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

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

2019-06-18 Пенетрантность Maxim Dounin
Hello!

On Tue, Jun 18, 2019 at 06:31:24AM +0300, Gena Makhomed wrote:

> Здравствуйте, All!
> 
> Есть такой фрагмент документации на директиву location:
> 
>  Синтаксис: location [ = | ~ | ~* | ^~ ] uri { ... }
> 
>  Для сопоставления используется URI запроса в нормализованном виде,
>  после декодирования текста, заданного в виде “%XX”, преобразования
>  относительных элементов пути “.” и “..” в реальные и возможной
>  замены двух и более подряд идущих слэшей на один.
> 
> Есть такой фрагмент конфига:
> 
>  location ~ ^/wiki/(?.*) {
>  return 301 https://$host/$title$is_args$args;
>  }
> 
> Судя по документации, этот фрагмент конфига не должен работать, потому
> что в $title ведь попадает уже декодированный русский текст из location?
> 
> Но почему-то эксперимент с помощью curl показывает, что в редиректе 
> возвращается текст закодированный в виде “%XX”, а не обычный Unicode.

Эксперимент, видимо, плохой, негодный.

$ curl -vvv http://127.0.0.1:8080/wiki/%d1%82%d0%b5%d1%81%d1%82
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /wiki/%d1%82%d0%b5%d1%81%d1%82 HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.62.0
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Server: nginx/1.17.1
< Date: Tue, 18 Jun 2019 08:25:18 GMT
< Content-Type: text/html
< Content-Length: 169
< Connection: keep-alive
< Location: https://127.0.0.1/тест
< 

301 Moved Permanently

301 Moved Permanently
nginx/1.17.1


* Connection #0 to host 127.0.0.1 left intact

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru