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