#nginx #nginx-config #nginx-location
Вопрос:
Для локального развития я пытаюсь обслуживать статический контент из общедоступного каталога. Мои образы живут внутри app/public/images
, и мой корень app/public
в этом . На мои изображения смотрят снизу вверх /d/my_app_name/images/<image>.png
. Я сопоставляю /d/my_app_name/images
местоположение, но пытаюсь понять, как затем извлечь имя файла и заставить nginx найти соответствующее имя файла из каталога изображений? Мои текущие настройки:
root /app/public;
index index.php;
location /d/my_app_name/images/ {
root /images/; # <--- I guess this rule is making nginx look up a file that matches the entire relative path, rather than just the filename
}
Обновить
Мне удалось сопоставить его и найти имя файла только из того, что кажется правильным каталогом, но я все еще получаю ошибку «не найдено». Я предполагаю, что относительный путь, указанный в ошибке, относится к корню, и в этом случае этот файл/каталог должен существовать.
root /app/public;
index index.php;
location /d/my_app_name/images/ {
alias /images/;
}
Когда я захожу в localhost:8380/d/my_app_name/images/my_image.png
него, он ищет правильный файл png в каталоге app/public/images, но все равно говорит, что его не существует.
[error] 8#0: *1 open() "/images/my_image.png" failed (2: No such file or directory), client: 192.168.176.1, server: devbox, request: "GET /d/my_app_name/images/my_image.png HTTP/1.1", host: "localhost:8380"
Изображения хранятся в /app/public/images
каталоге.
Ответ №1:
Я думаю, что у вас перевернутое местоположение и корневые пути.
Я могу предложить вам изменить свой блок местоположения следующим образом:
location /images/ {
root /d/my_app_name/images/; # override global root to your specific path where your images are hosted
}
Дополнительные примеры конфигураций можно найти в официальной документации.
Комментарии:
1. Я не уверен, что следую — местоположение должно соответствовать пути запроса , правильно? т. Е. Я просматриваю свои изображения
localhost:5000/d/my_app_name/images/filename.png
, поэтому местоположение совпадает/d/my_app_name/images
?2. Неправильно понятое здесь, я думаю, вы можете следовать ответу @Sam.
Ответ №2:
Вы можете использовать простой псевдоним, который указывает Nginx искать все файлы по другому пути. Root будет работать только в том случае, если ваше местоположение было просто изображениями и фактически используется в документации: https://nginx.org/en/docs/http/ngx_http_core_module.html#alias
root /app/public; #Use full path, ex: /home/username/repo/app/public/
index index.php;
location /d/my_app_name/images/ {
alias /app/public/images/; # Use full path, ex: /home/username/repo/app/public/
}
Комментарии:
1. Спасибо за ваш ответ, но я не уверен, что это сработает (при условии, что я правильно понимаю). Это должно быть портативное решение, которое будет работать на любой машине, поэтому я не могу жестко указать полный путь — он должен быть относительно корня nginx.
2. Я смог заставить его делать то, что, как я ДУМАЛ, сработает, но все равно не работает
root /app/public; index index.php; location /d/my_app_name/images/ { alias /images/; }
, когда я иду кlocalhost:8380/d/my_app_name/images/my_image.png
нему, я ищу правильныйpng
файл вapp/public/images
каталоге, но он все еще говорит, что его не существует.[error] 8#0: *1 open() "/images/my_image.png" failed (2: No such file or directory), client: 192.168.176.1, server: devbox, request: "GET /d/my_app_name/images/my_image.png HTTP/1.1", host: "localhost:8380"
3. Мне пришлось бы много покопаться, чтобы понять, как nginx может выполнить ваш вторичный запрос. Мое предложение состоит в том, чтобы использовать /var/www/html, который по умолчанию используется большинством установок nginx. Поскольку каждый компьютер отличается, вы можете поместить туда статические файлы. Полный путь, который я считаю достаточно распространенным и поддерживаемым псевдонимом, я бы предпочел вместо этого использовать свой первоначальный ответ.