2013-12-06 4 views
1

Издание:Условный Расположение маршрутизации - Nginx

У меня есть два приложения, обслуживаемые одним Nginx 1.5.5 веб-сервера на одном домене, www.domain.com.

Поскольку они оба слушают в тех же местах, я добавил заголовок APP = ONE или TWO, который я установил, когда приложение сначала вызвано. Пример ниже.

location ^/APPONE { 
      proxy_pass http://APPONE; 
       add_header    APP    ONE; 
       proxy_set_header  Host   $host; 
       proxy_set_header  X-Real-IP  $remote_addr; 
       proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

location ^/APPTWO { 
      proxy_pass http://APPTWO; 
       add_header    APP    TWO; 
       proxy_set_header  Host   $host; 
       proxy_set_header  X-Real-IP  $remote_addr; 
       proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

Из-за плохой конструкции приложения приложения запрашивают нижеследующие местоположения, не используя имя приложения в качестве docroot. Как пример ниже.

location ~ ^/(framerwork1/|framerwork2/|framerwork3/) { 
      proxy_pass http://APPONE; 
       add_header    APP    ONE; 
       proxy_set_header  Host   $host; 
       proxy_set_header  X-Real-IP  $remote_addr; 
       proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

location ~ ^/(framerwork1/|framerwork2/|framerwork3/) { 
       proxy_pass http://APPTWO; 
       add_header    APP    TWO; 
       proxy_set_header  Host   $host; 
       proxy_set_header  X-Real-IP  $remote_addr; 
       proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 

    } 

Итак, я добавил APP один или два, заголовок, чтобы отделить два, но я, если заявления на доверенности их на основе заголовка не принимаются Nginx. Пример ниже.

if ($http_host ~ 'APP=ONE') { 

     location ~ ^/(framerwork1/|framerwork2/|framerwork3/) { 
       proxy_pass http://APPONE; 
       add_header    APP    ONE; 
       proxy_set_header  Host   $host; 
       proxy_set_header  X-Real-IP  $remote_addr; 
       proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

if ($http_host ~ 'APP=TWO') { 

     location ~ ^/(framerwork1/|framerwork2/|framerwork3/) { 
       proxy_pass http://APPTWO; 
       add_header    APP    TWO; 
       proxy_set_header  Host   $host; 
       proxy_set_header  X-Real-IP  $remote_addr; 
       proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

Вопрос: Как я могу проксировать эти два приложения успешно на основе заголовка? Обратите внимание: я не могу использовать другой серверный блок или домен. Они должны быть одинаковыми.

Заранее спасибо.

+0

Чтобы быть ясным, что вы надеетесь, произойдет, когда вы установите «add_header APP ONE»; ? – Danack

+0

@Danack Это добавит переменную заголовка, которую я могу использовать для фильтрации. Это неправильный способ сделать это? – Rhys

+0

Заголовок будет добавлен в запрос на proxy_server по запросу, сделанному в/APPONE, он не будет установлен клиентами для будущих запросов, которые они делают для местоположения/framerwork1. – Danack

ответ

0

Хорошо, поэтому запрос поступает на сайт www.domain.com/APPONE. Вы не указываете точно, что запрашивается через URL www.domain.com/framerwork1/, но представьте себе, что это изображение, которое требуется на странице, обслуживаемой в/APPONE, поскольку это просто понять.

Когда вы устанавливаете заголовок через 'add_header', он устанавливается во втором массиве в «Client» -> Nginx -> PHP Proxy.

Когда клиент отправляет запрос на изображение по адресу www.domain.com/framerwork1/, он не подозревает, что вы надеетесь установить заголовок, чтобы определить, было ли изображение запрошено APPONE, или что-то другое.

Даже если вы настроили заголовок ответа на www.domain.com/APPONE, клиенты не слепо перехватывают заголовки, отправленные им обратно на сервер для последующих запросов.

Или, честно говоря, я думаю, вы неправильно поняли, где передаются заголовки, и что на самом деле нет способа определить, какое приложение делает запрос на/framerwork1/URL-адрес. Вы должны сделать это либо с помощью отдельных доменных имен (или поддоменов), либо путем выполнения этого в своем приложении с такими вещами, как просмотр того приложения, в которое пользователь вошел.

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