Как я могу зафиксировать перенаправления Sinatra, переключающиеся от https до http под nginx?

Adtran очень распространена, я использовал их прежде. Вы могли объяснить, какие требования Вы на самом деле имеете, которые устраняют Вас от использования маршрутизатора с WIC?

2
задан 10 June 2011 в 20:43
3 ответа

Попробуйте следующее:

redirect "https://#{request.host}/<path>"

Sinatra легковесный, я думаю, он не имеет для этого никакого обнаружения по умолчанию.

0
ответ дан 3 December 2019 в 13:18

Этого можно добиться с помощью директивы proxy_redirect . Если proxy_redirect default не работает (это должно быть значение по умолчанию), попробуйте что-то вроде этого:

proxy_redirect http://localhost/ https://localhost/;
0
ответ дан 3 December 2019 в 13:18

url () определяет, использовать ли HTTP или HTTPS на основе информации из класса Sinatra :: Request , производного от Rack: : Запрос класс. При установке за обратным прокси-сервером, таким как Nginx, обратный прокси-сервер должен вводить некоторые заголовки, сообщающие Rack (и, следовательно, Sinatra) о том, как его видит мир. К сожалению, Nginx не устанавливает эти заголовки по умолчанию, поэтому нам придется сделать это вручную.

Давайте рассмотрим пример проблемной конфигурации.

# Bad configuration
location / {
    proxy_pass http://127.0.0.1:9000;
}

Синатра не знает, что он находится за обратным прокси, поэтому url ('/ robots.txt') сгенерирует http: // 127.0.0.1:9000/robots.txt . Nginx попытается исправить это автоматически с помощью замены по умолчанию proxy_redirect , в результате получится http: //hostname/robots.txt .

Вот пример предложения прокси из моего собственного Конфигурация Nginx.

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-SSL on;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://127.0.0.1:9000;
}

X-Forwarded-SSL: on сообщает Sinatra, что он находится за HTTPS, а не HTTP, а настройка Host: $ http_host сообщает Sinatra имя хоста реального сервера. Теперь url ('/ robots.txt') выведет https: //hostname/robots.txt . Поскольку нам не нужен Nginx для выполнения подстановок в наших перенаправлениях, я отключил его явно с помощью proxy_redirect off; . ( X-Forwarded-For предназначен только для того, чтобы Синатра мог также определить IP-адрес пользователя.)

Дополнительное преимущество в том, что Sinatra делает все правильно вместо proxy_redirect заключается в том, что вы можете использовать функцию url () в представлениях и т. П.

X-Forwarded-SSL - это только один из нескольких заголовков, которые вы можете установить. HTTPS: на , X-Forwarded-Scheme: https и X-Forwarded-Proto: https тоже должны работать нормально. Обратите внимание, что установка схемы на что-то вроде otherproto не будет работать с Sinatra, поскольку она проверяет, HTTPS это или нет, и генерирует URL-адрес на основе этого логического значения вместо простого копирования схемы.

Если вы Если вы хотите самостоятельно просмотреть код, я рекомендую эти две ссылки в качестве отправной точки:

https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L284 ( по умолчанию ) https://github.com/rack/rack/blob/master/lib/rack/request.rb#L199 ( def схема )

1
ответ дан 3 December 2019 в 13:18

Теги

Похожие вопросы