2014-08-28 1 views
0

Я пытаюсь использовать статический контент от S3. Я использую скрипт nginx и lua для его конфигурации. Я новичок в nginx и lua.Nginx подает ответ с 200 даже после вызова ngx.exit()

Задача, которую я хочу достичь, это: запрос

  1. Получить URL в Nginx.
  2. Аутентификация параметров запроса URL.
  3. Подача от S3, если параметры действительны.
  4. Отправлять ответ об ошибке, если параметры недействительны.

Мой nginx.conf файл выглядит следующим образом:

location ~ "^/media/(.*?)/(.*?)/(.*)$" { 
    set $mediaUrl "$1/$2/$3"; 
    set $key "$2/$3" 
    set $target http://$1.s3.amazonaws.com 

    rewrite_by_lua " 
     local uri = '/authenticate' 
     local res = ngx.location.capture(uri, {args = { param = '/xmedia/'.. ngx.var.mediaUrl }}) 

     if (res.status ~= 200) then 
       return ngx.exit(ngx.HTTP_GONE) 
       end 
     "; 

     rewrite .* /$key break; 
     proxy_pass $target; 
} 

location "/authenticate" { 
    proxy_set_header Range ""; 
    proxy_set_header Content-Range ""; 
    set_by_lua $param " 
     local params = ngx.req.get_uri_args() 
     return params.param 
    "; 

    set $test_url http://127.0.0.1:some_port/authenticate?url=$param; 
    proxy_pass $test_url; 
} 

I мой случай, если Аутентифицировать возвращает 200, то все работает отлично. Но даже если аутентификация возвращает null, nginx возвращает правильный файл и не дает отчета об ошибке, указанного в инструкции if: return ngx.exit(ngx.HTTP_GONE).

Я что-то не так? Как эффективно выполнять ожидаемое поведение?

Спасибо.

+0

http://wiki.nginx.org/HttpLuaModule#rewrite_by_lua Обратите внимание, что этот обработчик всегда запускается после стандартного HttpRewriteModule. –

+0

Спасибо за ваш ответ. Но если HttpRewriteModule всегда выполняется перед rewrite_by_lua, то как я могу достичь требуемой задачи? – sonam

+0

Использовать http://wiki.nginx.org/HttpLuaModule#ngx.exec внутри 'rewrite_by_lua' –

ответ

0

Как уже упоминалось в комментариях к вашему вопросу, HttpRewriteModule всегда выполняется перед rewrite_by_lua; поэтому вы должны поставить логику на секции rewrite_by_lua с использованием ngx.req.set_uri, как это:

location ~ "^/media/(.*?)/(.*?)/(.*)$" { 
    set $mediaUrl "$1/$2/$3"; 
    set $key "$2/$3" 
    set $target http://$1.s3.amazonaws.com 

    rewrite_by_lua " 
     local uri = '/authenticate' 
     local res = ngx.location.capture(uri, {args = { param = '/xmedia/'.. ngx.var.mediaUrl }}) 
     if (res.status ~= 200) then 
       ngx.exit(ngx.HTTP_GONE) 
     else 
      ngx.req.set_uri(string.format('/%s', ngx.var.key)) 
     end 
    ";   
    proxy_pass $target; 
    } 
... 
Смежные вопросы