Функция X-Accel-Redirect не работает для внешних подключений (внутри сети Docker) - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь разрешить контейнеру с django управлять доступом к медиа-файлам, обслуживаемым из другого контейнера с помощью nginx.Из-за этого, несмотря на документацию nginx, я удалил строку internal из конфигурации местоположения:

server {
    server_name nginx; //name of the container used for accessing from another containers
    charset UTF-8;
    client_max_body_size 32m;
    listen 80;

    location /protected/media/ {
        // internal;
        alias /data/djan,go/media/;
    }
}

С этой конфигурацией я могу использовать / protected / media url из контейнеров django, поэтому яудалось сделать wget http://nginx/protected/media/images/bank_credentials/H0grsrvgsBo.jpg из оболочки контейнера с django.

Но код django

response = HttpResponse()
del response['Content-Type']
response['X-Accel-Redirect'] = 'http://nginx/protected/media/' + path # I'm sure that this url matches to url I've used succesfully with wget
return response 

, возвращающий 404 Вот URL-адрес django:

path('media/<path:path>', media_access, name='media')

Где я не прав?

1 Ответ

0 голосов
/ 13 марта 2019

Похоже, что вы пытаетесь сделать, это иметь X-Accel-Redirect с абсолютным URL для внешнего домена / хоста, следовательно, необходимо удалить internal согласно http://nginx.org/r/internal, чтобы сделать файлы доступнымибез аутентификации.Это не работает так.

Взгляните на примеры, представленные на http://nginx.org/r/proxy_pass_request_headers,, например:

location /x-accel-redirect-here/ {
    proxy_method GET;
    proxy_pass_request_headers off;
    proxy_pass_request_body off;

    proxy_pass ...
}

Было бы совершенно разумно, чтобы nginx имелтребование использования относительных URL в X-Accel-Redirect;в противном случае, как nginx узнает, как именно обрабатывать запрос?


Другими словами, вам, вероятно, придется использовать относительные URL-адреса в X-Accel-Redirect, и, если вам требуется экранирование в другой контейнер,иметь дополнительные internal location директивы для выполнения явного proxy_pass, в зависимости от ситуации.

Обратите внимание, что выполнение этого может лишить вас всех преимуществ использования X-Accel-Redirect в первую очередь, особенно из-за http://nginx.org/r/proxy_buffering по умолчанию on, что заставляет nginx сохранять каждый прокси-файл на диск, поэтому пропускная способность диска может быстро стать ограничивающим фактором в вашей настройке.

...