Nginx-statyczny plik obsługujący błąd z root & alias
Muszę obsługiwać moją aplikację przez serwer aplikacji na 8080
, a moje pliki statyczne z katalogu bez dotykania serwera aplikacji. Nginx Config mam jest coś takiego...
# app server on port 8080
# nginx listens on port 8123
server {
listen 8123;
access_log off;
location /static/ {
# root /var/www/app/static/;
alias /var/www/app/static/;
autoindex off;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Teraz, z tym config, wszystko działa dobrze. Zauważ, że dyrektywa root
jest komentowana.
Jeśli aktywuję root
i dezaktywuję alias
-- przestaje działać. Jednakże, kiedy usuwam końcowe /static/
z root
, zaczyna działać ponownie.
Can niech ktoś wyjaśni, o co chodzi. Proszę również jasno i zwięźle wyjaśnić, jakie są różnice między root
i alias
oraz ich cele.
7 answers
Znalazłem odpowiedzi na moje zamieszanie.
Istnieje bardzo istotna różnica między root
a alias
dyrektywami. Ta różnica istnieje w sposobie przetwarzania ścieżki określonej w root
lub alias
.
W przypadku dyrektywy root
, pełna ścieżka jest dołączana do katalogu głównego wraz z częścią lokalizacji, podczas gdy w przypadku dyrektywy alias
, dołączana jest tylko część ścieżki , z wyłączeniem części lokalizacji do pseudonimu .
Do zilustrowania:
Powiedzmy, że mamy config
location /static/ {
root /var/www/app/static/;
autoindex off;
}
W tym przypadku ostateczna ścieżka, którą wyprowadzi Nginx, będzie]}
/var/www/app/static/static
To powróci 404
ponieważ nie ma static/
W static/
Dzieje się tak dlatego, że część lokalizacji jest dołączana do ścieżki określonej w root
. Stąd, z root
, prawidłową drogą jest
location /static/ {
root /var/www/app/;
autoindex off;
}
Z drugiej strony, z alias
, część lokalizacji zostaje upuszczona . Więc dla config
location /static/ {
alias /var/www/app/static/;
autoindex off; ↑
} |
pay attention to this trailing slash
Ostateczna ścieżka zostanie poprawnie utworzona jako
/var/www/app/static
przypadek ukośnika końcowego dla alias
dyrektywy
Nie ma żadnych ostatecznych wytycznych dotyczących tego, czy końcowy Ukośnik jest obowiązkowy dla dokumentacji Nginx, ale powszechna obserwacja ludzi tutaj i gdzie indziej zdaje się wskazywać, że tak jest.
Kilka innych miejsc dyskutowało o tym, nie rozstrzygająco chociaż.
Https://serverfault.com/questions/375602/why-is-my-nginx-alias-not-working
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-20 09:00:55
As say as @ treecoder
W przypadku dyrektywy
root
pełna ścieżka jest dołączana do katalogu głównego wraz z częścią lokalizacji, podczas gdy w przypadku dyrektywyalias
do aliasu jest dołączana tylko część ścieżki nie zawierająca części lokalizacji.
Obraz jest wart tysiąca słów
Dla root
:
Dla alias
:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-14 17:41:37
W Twoim przypadku możesz użyć dyrektywy root
, ponieważ $uri
część dyrektywy location
jest taka sama z ostatnią częścią dyrektywy root
.
location /images/ { alias /data/w3/images/; }
Lepiej zamiast tego użyć dyrektywy root:
location /images/ { root /data/w3; }
I root
dyrektywa dołączą $uri
do ścieżki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-21 09:51:53
Tylko szybki dodatek do bardzo pomocnej odpowiedzi @good_computer, chciałem zastąpić katalogiem głównym adresu URL, ale tylko wtedy, gdy pasował do podfolderu zawierającego pliki statyczne(które chciałem zachować jako część ścieżki).
Na przykład, jeśli żądany plik znajduje się w /app/js
lub /app/css
, Poszukaj w /app/location/public/[that folder]
.
Mam to do pracy przy użyciu regex.
location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ {
alias /home/user/sites/app/public/$1;
access_log off;
expires max;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-05 16:38:31
alias
jest używany do zastąpienia ścieżki części lokalizacji (LPP) w ścieżce żądania, podczas gdy root
jest używany do poprzedzania ścieżki żądania.
Są to dwa sposoby mapowania ścieżki żądania do ostatecznej ścieżki pliku.
alias
może być używany tylko w bloku lokalizacji i nadpisuje zewnętrzny root
.
alias
i root
nie mogą być używane razem w bloku lokalizacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-25 09:47:52
server {
server_name xyz.com;
root /home/ubuntu/project_folder/;
client_max_body_size 10M;
access_log /var/log/nginx/project.access.log;
error_log /var/log/nginx/project.error.log;
location /static {
index index.html;
}
location /media {
alias /home/ubuntu/project/media/;
}
}
Blok serwera do obsługi statycznej strony na nginx.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-16 08:15:29
Innymi słowy: w przypadku root
podany argument location jest częścią ścieżki i URI. Z drugiej strony-dla alias
dyrektywy argument instrukcji location jest częścią URI tylko
Tak więc, {[1] } jest inną nazwą, która mapuje określone URI do określonej ścieżki w systemie plików, podczas gdy root
dodaje argument location do ścieżki głównej podanej jako argument do dyrektywy root
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-11 17:22:13