2016-05-04 9 views
1

Я пытаюсь создать раздел «разрешенные пользователи», и мне это удалось, но я застрял.Как перенаправить параметры url из Nginx в API моего сервера, чтобы я мог разрешить/запретить пользователям просматривать определенные файлы?

Я использую модуль auth_request для Nginx и Express.js.

Как я могу отправить запрошенный url на свой маршрут api?

"/" является общим URL-адресом, но /api/:filename следует уволить только тогда, когда посетитель пытается получить доступ к файлу независимо от местонахождения/URL-адреса этого файла. Короче говоря, я хочу сделать следующее: «Хорошо, я Nginx, и я вижу, что какой-то посетитель пытается получить доступ к этому файлу (или файлы, он проверяет индивидуально). Давайте передадим это имя на сервер Express.js и позволим ему проверьте, разрешено ли этому пользователю видеть этот образ или нет. Если он говорит 200, я разрешу его. Если это 403, то нет. "

app.get('/api/:filename', function(req,res,next) { 
    // This part decides what you're allowed to see. 
    // Redis database query. Returns 0 or 1. 
    // 1 means 200, 0 means 403. 
    res.sendStatus(200); 
    // It works if I omit :filename part, so this part is done in theory, 
    // but we didn't get the file name, so right now all we have is "yes 
    // to all" or "no to all", it's not dynamic. 
}); 

Вопрос заключается в том, я не знаю, как передать требуемый параметр URL-адрес из Nginx моего приложения Express.js (например image.jpgvideo.mp4, в формате http://localhost/api/:filename), так что я могу проверить разрешение пользователя по базе данных и возврату динамический ответ для каждого файла.

Вот моя конфигурация Nginx.

upstream localhost { 
    ip_hash; 
    server 127.0.0.1:8000; 
    server 127.0.0.1:8001; 
    server 127.0.0.1:8002; 
    server 127.0.0.1:8003; 
} 

server { 
    listen 80; 
    server_name localhost; 

    location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf)$ { 
    root images; 
    auth_request /api; // How to append requested filename to this URL? 
    } 

    location/{ 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $host; 
    proxy_http_version 1.1; 
    proxy_pass http://localhost; 
    } 
} 

EDIT 1

location = /api { 
    proxy_pass http://localhost; 
    proxy_pass_request_body off; 
    proxy_set_header Content-Length ""; 
    proxy_set_header X-Original-URI $request_uri; 
} 
+0

Я не уверен, что это ясно, что это такое, что вы просите ... – cnst

ответ

2

Определение пользовательского места для "/ API" и добавить/апи $ REQUEST_URI (оригинал Uri) в proxy_pass;

location = /api { 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $host; 
    proxy_http_version 1.1; 
    proxy_pass http://localhost/api$request_uri; 
} 
+0

Спасибо большое, я в конечном итоге использовала что-то очень похожее, но я использую заголовки (req.headers), чтобы получить доступ к файлу вместо добавления $ request_uri на api-маршрут, было бы проблемой? Пожалуйста, см. #EDIT 1. – salep

+1

@salep, если вы хотите видеть свои заголовки, тогда вы должны установить их с помощью 'proxy_set_header', [docs] (http://nginx.org/ru/docs/http/ngx_http_proxy_module.html# proxy_set_header) – m03geek

+0

@ m03geek, получил его. Я отредактирую свой ответ через несколько часов, я решил свою проблему, но этот ответ также помог многим :) – salep