nginx: упростить настройку для принудительного ssl на определенном пути для приложения rails

0

я использую конфиг ниже. это работает, но проблема для меня - повторение некоторых строк. что proxy_*директивы должны быть location /adminтакже, потому что только один locationбудет выполняться Nginx на запрос. Какие варианты у меня есть, чтобы удалить этот дубликат кода, не извлекая его в новые файлы и включить его впоследствии?

Есть ли возможность сказать, что nginx продолжать location @railsпосле того, как location /adminбыл выбран и обработан?

ну и кстати, в чем разница между location @railsи location /?

server {
  ...
  location /admin {
    include /etc/nginx/force_ssl;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://rails;

  }

  location @rails {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://rails;
  }
...
}

/ И т.д. / Nginx / force_ssl:

if ( $scheme = "http" ) {
  rewrite  ^/(.*)$  https://$host/$1 permanent;
}
али
источник

Ответы:

0

Вы задаете несколько вопросов.


По первому вопросу, как избавиться от избыточности:

В общем, вы можете переместить любую часть файла конфигурации в отдельный файл, а затем использовать includeдирективу, чтобы включить его один или несколько раз. включить директиву


Второй вопрос, касающийся перенаправления из одного места в другое:

Используя rewriteдирективу, вы можете вызывать одно местоположение из другого. Внутри Nginx создаст второй запрос для обработки вызываемого местоположения, но пользователь ничего этого не видит. С ключевым словом lastпосле пункта назначения перезаписи вы указываете Nginx прекратить обработку правил в этой точке и выбирать следующее местоположение на основе текущего содержимого $uri, эта переменная содержит результат всех уже выполненных перезаписей. Так, например, если вы просто хотите перенаправить все к @railsвам, вы можете использовать такое правило, чтобы переписать любой URL-адрес, @railsа затем lastсказать Nginx, что нужно искать местоположение с именем @rails:

rewrite . @rails last;

Подробности описаны здесь: переписать модуль


В своем третьем вопросе вы спрашиваете, есть ли разница между двумя местоположениями @railsи /admin:

Я не могу сказать вам, основываясь на отбитых вами сообщениях. Я только вижу, что /adminвключает в себя еще один файл, чем @rails. Таким образом, ответ на этот вопрос зависит от вашего внутреннего приложения и контекста остальной части конфигурации Nginx.

переигровка
источник
спасибо, переписывание, кажется, лучшее решение для меня, плохо проверю это! тем временем к третьему вопросу: я спросил, в чем разница между location @railsи location /(root, а не / admin!). я могу заменить @rails на / без явных изменений в поведении веб-сервера ...
Али
Я не могу однозначно ответить на вопрос, касающийся разницы между /и @railsпотому, что это зависит от двух факторов: 1. Как ваше бэкэнд-приложение обрабатывает переписанные запросы 2. Остальным из вас Nginx conf, который вы не опубликовали. Например , если ваш location /не делает ничего другого , чем назвать @railsэто вполне возможно , что вы могли бы, а просто бросить location /и переименовать @railsв /, но это только и пример , и я ничего не могу гарантировать.
повторить
Хорошо, я заменил proxy_*директивы rewrite . @reils last;на location /adminсейчас. сейчас он перенаправляет меня на https, но не запрашивает приложение @rails. вывод остается пустым белым. :(
Али
Извините, я не могу удаленно отлаживать ваше приложение, Stack Exchange предназначен для точных вопросов, на которые можно ответить на основе предоставленной информации.
повторить