alias vs root with re location

Maxim Dounin mdounin на mdounin.ru
Пт Авг 13 16:45:16 MSD 2010


Hello!

On Fri, Aug 13, 2010 at 01:18:37PM +0300, Vasil Mikhalenya wrote:

> Привет всем,
> 
> заметил странности в поведении дерективы alias, а точнее необъяснимое
> поведение
> 
> 2010/08/13 12:05:03 [error] 28688#0: *89 opendir()
> "/opt/gptour/web-app-stat/gptour/*uploa*" failed (2: No such file or
> directory), client: ipaddress, server: blabla.com, request: "GET /upload/
> HTTP/1.0", host: "blabla.com"
> 
> в конфиге
> 
>         location ~* ^/upload {
>                 autoindex on;
>                 expires      max;
>                 alias           /opt/gptour/web-app-stat/gptour/upload;

В location'е, заданном регулярным выражением, alias задаёт полный 
путь к файлу.  Потому как иначе - никак, это вам не prefix match 
где alias заменяет root + префикс uri который совпал с 
location'ом, тут понятия "префикс который совпал" не существует.

В данном случае - мы видим проблему в модуле autoindex, который 
видит запрос на индекс, и пытается "убрать" слэш из пути (а в 
пути-то слеша и нет...).

Но даже если эту проблему исправить - любой запрос к 
/upload/something будет пытаться открыть каталог 
/opt/gptour/web-app-stat/gptour/upload.  Вероятно это не то чего 
хотелось добиться.

> Соответсвенно отдается 404.
> 
> Заметил это, когда хотел несколько алььтернатив в регулярке добавить в один
> location.
> директива root работает нормально, но тогда нужно несколько одинаковых
> location.
> 
> Еще пример:
> 
> ==> /var/log/nginx/error.log <==
> 2010/08/13 12:09:55 [error] 29076#0: *148
> "/opt/gptour/web-app-stat/gptour/upload*0* <-- тут перенос строки в логе
> *Hostindex.html*" is not found (2: No such file or directory), client:
> 
> если в конфиге
> 
>         location ~* ^/(upload|files) {
>                 autoindex on;
>                 expires      max;
>                 alias           /opt/gptour/web-app-stat/gptour/upload;

-                 alias           /opt/gptour/web-app-stat/gptour/upload;
+                 alias           /opt/gptour/web-app-stat/gptour/upload$uri;

Или, что лучше, используйте статические location'ы.  Регулярные 
выражения в данном случае нафиг не нужны.

Maxim Dounin



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