NGINX: root vs alias
21 Dec 2017
Za pomocą dyrektywy alias możesz mapować nazwę na inną nazwę pliku, natomiast dyrektywa root określa jasno wskazany plik w danym katalogu. W pierwszym przypadku NGINX zastępuje przedrostek ciągu np. /robots.txt
w ścieżce adresu URL na /var/www/static/robots.01.txt
, a następnie wykorzystuje wynik jako ścieżkę do systemu plików. W drugim NGINX wstawia ciąg np. /var/www/static/
na początku ścieżki adresu URL, a następnie wykorzystuje wynik jako ścieżkę do systemu plików.
Poniżej znajduje się różnica w działaniu obu mechanizmów. W pierwszym przykładzie dyrektywa alias
zadziała prawidłowo:
location ^~ /wordpress/ { alias /var/www/wordpress/; }
Ale już poniższy kod nie zadziała:
location ^~ /wordpress/ { root /var/www/wordpress/; }
Powinien on wyglądać tak:
location ^~ /wordpress/ { root /var/www/; }
Dyrektywa root
jest zwykle umieszczana w blokach serwera i lokalizacji. Umieszczenie tej dyrektywy w bloku serwera powoduje, że jest ona dostępna dla wszystkich bloków lokalizacji w tym samym bloku serwera (co jest oczywiste ze względu na dziedziczenie). Co więcej, mówi ona, aby NGINX pobierał adres URL żądania i dołączał go do określonego katalogu. Na przykład z następującym blokiem konfiguracji:
server {
server_name example.com;
listen 10.250.250.10:80;
index index.html;
root /var/www/example.com;
location / {
try_files $uri $uri/ =404;
}
location ^~ /images {
root /var/www/static;
try_files $uri $uri/ =404;
}
}
NGINX zmapuje złożone żądanie na:
- http://example.com/images/logo.png do ścieżki
/var/www/static/images/logo.png
- http://example.com/contact.html do ścieżki
/var/www/example.com/contact.html
- http://example.com/about/us.html do ścieżki
/var/www/example.com/about/us.html
Podobnie jeśli chcesz przekazywać wszystkie żądania, które zaczynają się od /static
a dane znajdują się w /var/www/static
, powinieneś ustawić:
- pierwsza część ścieżki, tj. first_path:
/var/www
- ostatnia część ścieżki, tj. last_path:
/static
- pełna ścieżka w wyniku połączenia:
/var/www/static
location last_path {
root first_path;
...
}
Dokumentacja NGINX na temat dyrektywy alias
sugeruje, że lepiej jest używać root
nad aliasem, gdy lokalizacja odpowiada ostatniej części wartości dyrektywy. Pamiętajmy, że aliasy można umieścić tylko w bloku lokalizacji. Poniżej przedstawiono zestaw konfiguracji ilustrujących zastosowanie tej dyrektywy:
server {
server_name example.com;
listen 10.250.250.10:80;
index index.html;
root /var/www/example.com;
location / {
try_files $uri $uri/ =404;
}
location ^~ /images {
alias /var/www/static;
try_files $uri $uri/ =404;
}
}
Dzięki czemu NGINX zmapuje złożone żądanie na:
- http://example.com/images/logo.png do ścieżki pliku
/var/www/static/logo.png
- http://example.com/images/ext/img.png do ścieżki pliku
/var/www/static/ext/img.png
- http://example.com/contact.html do ścieżki pliku
/var/www/example.com/contact.html
- http://example.com/about/us.html do ścieżki pliku
/var/www/example.com/about/us.html
Kiedy lokalizacja jest zgodna z ostatnią częścią wartości dyrektywy, lepiej jest użyć dyrektywy głównej (wydaje się, że jest to dowolny wybór stylu, ponieważ autorzy w ogóle nie uzasadniają tej konstrukcji).
Spójrz na ten przykład z oficjalnej dokumentacji:
location /images/ {
alias /data/w3/images/;
}
# Lepsze rozwiązanie:
location /images/ {
root /data/w3;
}