Pylons - перенаправления будут сбрасываться с HTTPS на HTTP, если я не укажу протокол ... Есть ли способ исправить это? - PullRequest
2 голосов
/ 14 сентября 2010

На моем веб-сайте Pylons моя форма входа в систему отправляет данные на 'https://mysite.com'.. При успешном входе в систему происходит перенаправление, чтобы отправить их на страницу своего профиля.

redirect(url(controller='profile'))

Отправляет пользователя на http://mysite.com/profile вместо https://mysite.com/profile. Единственный способ, который я нашел, чтобы исправить это, это изменить перенаправление на:

redirect(url(controller='profile', protocol='https'))

Проблема, с которой я сталкиваюсь, заключается в том, «что если по какой-то причине мой сертификат исчезнет, ​​и мне придется сбросить SSL», мне не нужно проходить весь мой код в поисках всех переадресаций, которые я указал Протокол https. Я хочу, чтобы мой логин отправил пользователя на HTTPS, и все ...

Есть ли причина, по которой перенаправление падает на HTTP? Есть ли способ остановить это? : /

Ответы [ 2 ]

4 голосов
/ 29 декабря 2010

Так как я провел пару часов, пробираясь через пилоны / маршруты / мензурки / и т.д.Источник, я думал, что поделюсь своим решением.

Сначала немного контекста.Я использую эластичный балансировщик нагрузки (ELB) в AWS с SSL-терминацией.Приложение построено для запуска исключительно через https;В конце концов, это мир после пожара.Он выглядит следующим образом:

ELB -> nginx -> pasteWSGI -> pylons

ELB очень хорош с точки зрения простоты, но любой вызов pylons.controllers.util.redirect вызовет перенаправление 302 на "http://mysite/". ELB не изменит это наобратный путь (без причины), и мой браузер будет отправлен обратно на порт 80, и на этом порту не будет прослушиваться ELB.

Я попытался обновить Mapper, как предложено выше.

  1. это не сработало,
  2. Я хотел, чтобы мои перенаправления были относительными. Переключение на https в пилонах означает, что генератор URL отправляется и выбирает хост для создания нового URL (https://localhost/....)

Обратите внимание, что Mapper.redirect_to работает "из коробки" и использует относительные перенаправления, поэтому нет необходимости возиться с этим. Основная проблема заключается в том, что controllers.redirect использует немного другой путь кода. В частности, в Routes,controllers.util.redirect не является редиректом (есть «если маршруты и маршруты. редирект», который переходит в False).

Мое решение: заменить все вызовы для перенаправленияс помощью нового метода контроллера (также называемого перенаправлением) для изменения перенаправлений с абсолютных на относительные перенаправления.

Код выглядит следующим образом:

lib / helpers.py

def relative_redirect(to_url, start_response):
    """Returns a redirect that is compatible with AWS ELB (no absolute http responses)
    Using pylons.controllers.util.redirect triggers an exception that'll be turned into a 302
    But with an absolute path so the response does not contains https but simple http
    """
    start_response("302 Found", [("Content-Type", "text/plain; charset=utf-8"), ("Location", url(to_url))])
    return ["You are being redirected to {0}".format(url(to_url))]

Этот бит вызывается из базового класса моих контроллеров:

class BaseController(WSGIController):
   ...
   def redirect(self, to_url):
        """Force a relative redirection, to work with AWS ELB"""
        return relative_redirect(to_url, self.start_response)
0 голосов
/ 19 октября 2010

Я бы настроил Mapper так, чтобы каждый вызов "url" приводил к корректному протоколу ...
Внутри routing.py:

class CustomMapper(Mapper):

    def generate(self, *args, **kwargs):
        kwargs["protocol"] = "https"
        return Mapper.generate(self, *args, **kwargs)

def make_map(config):
    """Create, configure and return the routes Mapper"""
    map = CustomMapper(directory=config['pylons.paths']['controllers'],
                       always_scan=config['debug'])
...