Re: the “alias” directive must use captures + оптимизация конфига

Maxim Dounin mdounin на mdounin.ru
Ср Янв 27 03:31:50 MSK 2010


Hello!

On Wed, Jan 27, 2010 at 02:30:12AM +0500, Nick Knutov wrote:

> А кто-нибудь может сказать, зачем именно the “alias” directive must
> use captures inside location given by regular expression? Почему
> нельзя сделать локейшен с регекспом, но внутри ничего из регекспа не
> использовать?

В нормальной ситуации (статический location) alias задаёт путь до 
того места, которое поматчилось location'ом (в отличии от 
директивы root, которая задаёт путь до корневого каталога).

В случае regex location'ов - "поматчился" весь uri, т.е. alias 
должен задавать полный путь.

В принципе я считаю что "must use captures" - это неправильно. 
Т.е. сейчас это по факту не так, достаточно просто использовать 
переменные.  Но мне кажется что вполне логично задавать полный 
путь и без использования переменных (я в частности периодически с 
подобной задачей сталкиваюсь, и необходимость использования 
переменных только мешает).  Однако есть мнение что это 
вызовет большой поток вопросов от людей написавших в конфиге 
что-нибудь в духе

   location ~ \.jpg$ {
       alias /path/to/images/directory/;
   }

и удивляющихся почему оно не работает.

> И заодним - чтобы обрабатывать интернал редиректы в статику, но
> статику никогда не отдавать апачу - приходится делать тафталогию в
> конфиге.
> 
> Нельзя ли это как-то оптимизировать и упростить?
> 
> location / {
> 	proxy_pass          http://127.0.0.2:80;
> 	[...]
> }
> 
> location /internal_xxx/ {
> 	alias /home/***/www/***/;
> 	internal;
> }
> location ~* ^/internal_xxx/(.+\.(?:jpg|jpeg|gif|png|txt))$ {
> 	alias /home/***/www/***/$1;
> 	internal;
> }
> 
> location ~* ^.+\.(jpg|jpeg|gif|png|txt)$ {
> 	root /home/***/www/***;
> 	expires 1d;
> }
> 
> Последний локейшен нужен чтобы обрабатывать статику не отправляя её
> апачу из первого локейшена, а второй интернал локейшен нужен чтобы
> правильно отдавалась статика если был сделан интернал редирект на
> нее. Если этот локейшен убрать - к пути добавляется internal_xxx/,
> всё это попадает в последний локейшн и 404.

- location /internal_xxx/ {
- location ^~ /internal_xxx/ {

Ну и "location ~* ^/internal_xxx/..." стереть.

Maxim Dounin



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