rewrite

Gena Makhomed gmm на csdoc.com
Ср Июл 20 19:52:39 UTC 2011


On 20.07.2011 22:04, Igor Sysoev wrote:

> Не надо rewrite.

кстати, в официальной документации к nginx не отражена
возможность использования "хорошей" директивы return
вместо "плохой" (deprecated?) директивы rewrite:

http://sysoev.ru/nginx/docs/http/ngx_http_rewrite_module.html#return

примеры такого использования "хорошей" директивы return
вместо rewrite можно найти только в списке рассылки nginx:

On 06.06.2011 16:40, Igor Sysoev wrote:

 > location = /file.rpm {
 >      return 301  http://www.domain2.com/folder/file.rpm;
 > }

================================================================

это было бы полезно отразить в документации,
чтобы все знали, что например, вместо

location ~* ^(/старый:)(.*)$ {
     rewrite ^ /новый:$2 permanent;
}

просто писать гораздо проще:

location ~* ^(/старый:)(.*)$ {
     return 301 /новый:$2;
}

потому что сейчас с rewrite имеем достаточно
нетривиальные "грабли" в таких случаях:

On 20.07.2011 14:48, Maxim Dounin wrote:
...
 >> location ~* ^(/старый:)(.*)$ {
 >>      rewrite ^ /новый:$2 permanent;
 >> }
...
 > Директива rewrite сама по себе выполняет регулярное выражение,
 > соответственно $2 будет браться из него (последнего выполненного).
 > Можно сделать с использованием именованных выделений, так:
 >
 >      location ~ ^/старый:(?<page>.*)$ {
 >          rewrite ^ /новый:$page permanent;
 >      }

=============================================================

как вариант - имеет смысл сделать "оптимизацию"
при парсинге конфиге nginx и если встречается

           rewrite ^ URL permanent;

транслировать этот "исходник" в "машинный код"

           return 301 URL;

аналогично и для случая

           rewrite ^ URL redirect;

транслировать в

           return 302 URL;

-----------------------------

обратная совместимость со старыми версиями nginx
при этом не пострадает, но зато будет меньше вопросов
в списке рассылки nginx - почему фрагмент конфига не работает.

а если high performance уже не нужно - то хотя бы поправить доку...
(код "return 301" работает быстрее чем обращение к библиотеке pcre)

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

location /uri-static-prefix/
     location ~ regexp {
         rewrite ^ URL permanent;
     }
}

вместо неэффективного и трудночитаемого

location / {
     rewrite regexp URL permanent;
}

неэффективного - потому что prce будет пытаться матчить
regexp на каждый $uri, а трудночитаемого - потому что
судя по документации к rewrite - в нем нельзя использовать
именованные выделения, а только $1 $2 $3 $4 $5 $6 $7 $8 $9
которые труднее читать и понимать, чем обычные $переменнные.

-- 
Best regards,
  Gena



Подробная информация о списке рассылки nginx-ru