nginx & internal & redirect

Maxim Dounin mdounin at mdounin.ru
Mon Aug 25 16:00:23 UTC 2014


Hello!

On Mon, Aug 25, 2014 at 10:51:50AM -0400, BieZax wrote:

[...]

> Добрый  день!
> Захотелось мне  авторизовываться  через  mysql, нормальных  модулей  не 
> нашел и нарисовал  свой  костыль  в виде  перлового  демона,  который 
> слушает  на  порту 8080  и  в случае удачной авторизации возвращает
> `"X-Accel-Redirect: /ok" .  $url`. В  конфиге   nginx   эта конструкция 
> выглядит  следующим образом:

Just a side note: есть auth_request, которой делает приблизительно 
то же самое, но чуть удобнее с точки зрения конфигурирования.  
Подробнее тут:

http://nginx.org/ru/docs/http/ngx_http_auth_request_module.html

>       location /test/ {
>                 proxy_set_header X-CAuth-Realm "test";
>                 proxy_set_header X-CAuth-Base "test";
>                 proxy_set_header X-CAuth-Table "test";
>                 proxy_set_header X-CAuth-GField "test";
>                 proxy_set_header X-CAuth-PassF "password";
>                 proxy_set_header Host $host;
>                 proxy_set_header X-Real-IP       $remote_addr;
>                 proxy_set_header X-Forwarded-Host $host;
>                 proxy_set_header X-Forwarded-Server $host;
>                 proxy_set_header X-Forwarded-For
> $proxy_add_x_forwarded_for;
>                 proxy_pass http://127.0.0.1:8080;
>         }
> 
>         location  /ok/test/ {
>                 internal;
>                 proxy_pass https://hostname/test2/;
>                 proxy_redirect   https://hostname/test2/  /ok/test/;
>         }
>         location /test2/ {
> #               rewrite  ^/test2/$  /test2/qwe.pl redirect;
>                 proxy_pass  http://127.0.0.1:8081/test/;
>                 proxy_redirect  http://127.0.0.1:8081/test/ /ok/test/;
>         }
> И все прекрасно  работало,  пока  не появился редирект(закоменчен).  После
> попадания   в редирект  меня перекидывает   сюда http://ok/test/qwe.pl. 
> Никак не могу понять, откуда берется "ок", может кто-то сможет мне
> подсказать ?

Если берётся сразу после "http://", то это должно быть имя хоста 
из заголовка Host или server_name.

Вообще, судя по конфигу, должен возвращаться редиркет на 
"http://<hostname>/ok/test/qwe.pl":

- запрос к "/ok/test/" проксируется на https://hostname/test2/;

- rewrite в "location /test2/" возвращает перенаправление на 
  "/test2/qwe.pl" (+ "https://hostname");

- proxy_redirect в "location /ok/test/" заменяет префикс 
  "https://hostname/test2/" на "/ok/test/", т.е. перенаправление 
  на "/ok/test/qwe.pl" (при возврате клиенту - к этому добавляет 
  схема и имя хоста).

Всё это в предположении, что "proxy_pass https://hostname" - суть 
проксирование на тот же nginx.

-- 
Maxim Dounin
http://nginx.org/



Подробная информация о списке рассылки nginx-ru