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

Я пытаюсь разрешить контейнеру с 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 из оболочки контейнера с джанго.

Но код Джанго

        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 Джанго:

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

Где я не прав?

0 ответов

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

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

Другие вопросы по тегам