2016-01-18 7 views
1

Учитывая следующий http-блок, nginx выполняет так, как ожидалось. То есть, он перепишет URL-адрес, такой как http://localhost/3ba48599-8be8-4326-8bd0-1ac6591c2041/, http://localhost/modif/3ba48599-8be8-4326-8bd0-1ac6591c2041/ и передает его на сервер uwsgi.Почему моя директива nginx «переписать» вызывает цикл перенаправления?

http {  
    upstream frontend { 
     server frontend:8000; 
    } 

    server { 
     listen 8000; 
     server_name localhost; 

     root /www/; 

     location ~* "^/([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})/?$" { 
      include uwsgi_params; 
      set $uuid $1; 
      if ($cookie_admin) { 
       # if cookie exists, rewrite /<uuid> to /modif/<uuid> and pass to uwsgi 
       rewrite//modif/$uuid break; 
       uwsgi_pass frontend; 
      } 
      content_by_lua_block { 
       ngx.say("Ping! You got here because you have no cookies!") 
      } 
     } 
    } 
} 

Однако, когда я добавить еще один location блок в манере отображения удара, вещи падают Appart и я получаю ERR_TOO_MANY_REDIRECTS.

http { 
    # access_log /dev/stdout; # so we can `docker log` it. 

    upstream frontend { 
     server frontend:8000; 
    } 

    server { 
     listen 8000; 
     server_name localhost; 

     root /www/; 

     location/{ # THIS MAKES EVERYTHING FALL APART :(
      uwsgi_pass frontend; 
      include uwsgi_params; 
     } 

     location ~* "^/([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})/?$" { 
      include uwsgi_params; 
      set $uuid $1; 
      if ($cookie_admin) { 
       # if cookie exists, rewrite /<uuid> to /modif/<uuid> and pass to uwsgi 
       rewrite//modif/$uuid break; 
       uwsgi_pass frontend; 
      } 
      content_by_lua_block { 
       ngx.say("Ping! You got here because you have no cookies!") 
      } 
     } 
    } 
} 

Что здесь происходит, точно? Как я могу это исправить?

+0

Какой URL-адрес вызывает проблему и на что она перенаправляется? –

+0

@RichardSmith, любой URL-адрес, который был захвачен регулярным выражением местоположения (например, '/ ', приведет к ошибке, отмеченной мной. Я представил пример одного из таких URL в вопросе. Я не уверен, как я могу проверьте, где он перенаправляется. Беглый взгляд на инструменты для Chrome-хроники, кажется, предполагает, что он захватывается одним и тем же блоком местоположения снова и снова (но опять же, я не уверен). – blz

+0

Я не использую хром, но похоже, что вкладка resources -> headers покажет вам детали. Поле 'location' в заголовке ответа - это то, что вы ищете. Поскольку ваша конфигурация' nginx' не создает внешние перенаправления, она, вероятно, исходит из upstream application. –

ответ

0

Я вижу, что ваш Nginx прослушивает порт 8000, но ваш восходящий сервер находится на «frontend», также на порту 8000. Если frontend переходит на тот же сервер, на котором работает Nginx, у вас есть цикл запросы прокси-сервера.

+0

Мысль об этом тоже, но если это так - это не сработало бы в первом примере конфигурации – Vasfed

 Смежные вопросы

  • Нет связанных вопросов^_^