Nginx Соответствует Имени Файла Изображения На Основе Части URL-адреса?

#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. Поскольку каждый компьютер отличается, вы можете поместить туда статические файлы. Полный путь, который я считаю достаточно распространенным и поддерживаемым псевдонимом, я бы предпочел вместо этого использовать свой первоначальный ответ.