Работа location с алиасом

Maxim Dounin mdounin на mdounin.ru
Вс Окт 23 20:36:37 UTC 2022


Hello!

On Sun, Oct 23, 2022 at 08:19:58PM +0300, izorkin на gmail.com wrote:

> Здравствуйте.
> 
> Сейчас столкнулся с непонятной ошибкой.
> 
> Тестовый пример:
> ```
>     root /var/www;
> 
>     location / {
>       try_files $uri =404;
>     }
> 
>     location /test/ {
>       try_files $uri =404;
>       alias /var/test/;
>     }
> ```
> 
> Проверяю доступность тестового файла через curl:
> ```
> curl --head -k https://example.com/test/example.txt
> HTTP/2 200
> ...
> ```
> 
> Файл доступен. Лог отладки:
> ```
> ...
> *302 test location: "/"
> *302 test location: "test/"
> *302 using configuration "/test/"
> ...
> *302 http script var: "/test/example.txt"
> *302 trying to use file: "example.txt" "/var/test/example.txt"
> *302 try file uri: "/test/example.txt"
> ...
> *302 http filename: "/var/test/example.txt"
> ...
> *302 http2 output header: ":status: 200"
> ...
> ```
> 
> Меняю location `test` на такой вариант:
> ```
>     location ~ ^/(test|custom)/ {
>       try_files $uri =404;
>       alias /var/test/;
>     }
> ```
> 
> Теперь файл не доступен. По идее должно работать... Лог отладки:
> ```
> ...
> *303 test location: "/"
> *303 test location: ~ "^/(test|custom)/"
> *303 using configuration "^/(test|custom)/"
> ...
> *303 http script copy: "/var/test/"
> *303 http script var: "/test/example.txt"
> *303 trying to use file: "/test/example.txt" "/var/test//test/example.txt"
> *303 trying to use file: "=404" "/var/test/=404"
> *303 http finalize request: 404, "/test/example.txt?" a:1, c:1
> *303 http special response: 404, "/test/example.txt?"
> ...
> *303 http2 output header: ":status: 404"
> ...
> ```
> 
> Так и должно работать?
> Только вот если убрать параметр `alias /var/test/;`, то `location /test/` и `location ~ ^/(test|custom)/` работают одинаково.

Директива "alias" заменяет совпавшую часть location'а на заданный 
путь.  Если же location задан регулярным выражением, то "совпавшей 
части" как таковой нет, и это работает так (цитата по 
http://nginx.org/r/alias/ru):

: Если alias используется внутри location’а, заданного регулярным 
: выражением, то регулярное выражение должно содержать выделения, а 
: сам alias — ссылки на эти выделения (0.7.40), например:
: 
: location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ {
:     alias /data/w3/images/$1;
: }

То есть всё работает ровно так, как должно/документировано. 

Безусловно, в конкретном примере оно работает не очень ожидаемо 
для пользователя.  Но, скажем так, это не единственный пример, 
когда location'ы, заданные регулярными выражениями, работают не 
очень ожидаемо для пользователя.  Лучше использовать location'ы, 
заданные префиксной строкой, Игорь даже как-то доклад об этом 
делал.

-- 
Maxim Dounin
http://mdounin.ru/



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