Hello! On Tue, Jun 18, 2019 at 04:45:13PM +0300, Gena Makhomed wrote:
> On 18.06.2019 15:26, Maxim Dounin wrote: > > > И снова эксперимент плохой, негодный. > > Вот полный конфиг тестового сервера: > > server { > listen 8080; > > location /wiki1/ { > rewrite ^/wiki1/(.*) https://$host/$1; > } > > location /wiki2/ { > rewrite ^/wiki2/(?<title>.*) 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. > > И в то же время получаем такие разные результаты. Почему так? Потому что подстановка $1 делается из раскодированного URI запроса, и nginx знает, что данные в ней следует экранировать. А $title - произвольная переменная, и как и любая произвольная переменная - подставляется в предположении, что данные в ней корректно экранированы. В частности из-за этой магии обычно рекомендуют использовать return, где никакой подобной магии нет. Но если речь идёт о изменениях URI с необходимостью снятия/восстановления экранирования - это один из наиболее простых путей. -- Maxim Dounin http://mdounin.ru/ _______________________________________________ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru