Re: location + rewrite и (де)кодирование URI
    Maxim Dounin 
    mdounin на mdounin.ru
       
    Ср Июн 19 11:54:10 UTC 2019
    
    
  
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