Re: location + rewrite и (де)кодирование URI
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
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
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
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
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
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