2013-08-21 4 views
3

Было бы неплохо, если запросы Tornado Python на HTTP могли автоматически перенаправляться на HTTPS.Перенаправить HTTP-запросы на HTTPS в Tornado

Есть ли способ сделать это?

  • Python 3v
  • Торнадо 3.1V

Update

Новое решение, но ... Могу ли я сделать что-то неправильно (

HTTP: // IP_ADDRESS: 4443/

ВНИМАНИЕ: tornado.general: SS L Ошибка 8 ('IP_ADDRESS', 51453): [SSL: Http_Request] запрос HTTP (_ssl.c: 547)

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 

import os 
import tornado.ioloop 
import tornado.web 
import tornado.httpserver 
import http.server 


class MainHandler(tornado.web.RequestHandler): 
    def prepare(self): 
     if self.request.protocol == "http": 
      self.redirect("https://%s" % self.request.full_url()[len("http://"):], permanent=True) 

    def get(self): 
     self.write("Hello, world") 

application = tornado.web.Application([ 
    (r'/', MainHandler), 
]) 

http_server = tornado.httpserver.HTTPServer(application, 
    ssl_options = { 
    "certfile": os.path.join("/var/pyTest/keys/", "cert.pem"), 
    "keyfile": os.path.join("/var/pyTest/keys/", "key.pem"), 
    } 
) 

if __name__ == '__main__': 
    http_server.listen(4443) 
    tornado.ioloop.IOLoop.instance().start() 
+3

Я думаю, что должно быть два сервера экземпляры Слушание на двух различных портов для HTTP и https –

ответ

1

Вы должны иметь возможность вернуть код переадресации (TODO: поиск) или, возможно, страницу переадресации, JS, что бы вы ни решили, это хорошая идея. Дело в том, что если клиент (браузер) приходит через http, вам нужно обслуживать http. Затем попросите клиента подключиться к порту https (SSL). Вы не можете выполнять перенаправление на сервере самостоятельно.

Вам действительно понадобятся два порта для прослушивания, один с SSL (https) для вашего контента и один без (http), который будет обслуживать перенаправление. Я не пробовал делать это с Tornado, поэтому я не могу комментировать подробности.

К последней части и сообщения об ошибках:

Соединение с HTTP: // к порту ожидающей HTTPS даст SSL ошибки. Попробуйте использовать https: // в вашем клиенте. Убедитесь, что URL http: // указывает на порты, не обслуживающие https, и наоборот.

5

Ваше решение отлично подходит для базового развертывания.

Если вы используете балансировщик нагрузки AWS и ваш сертификат установлен на балансировщике нагрузки, вам необходимо проверить заголовок X-Forwarded-Proto.

def prepare(self): 
    if ('X-Forwarded-Proto' in self.request.headers and 
      self.request.headers['X-Forwarded-Proto'] != 'https'): 
     self.redirect(re.sub(r'^([^:]+)', 'https', self.request.full_url())) 
2

Вы должны создать другой экземпляр сервера, который прослушивает порт 80. Вот это модифицированная версия кода:

#!/usr/bin/env python 

import os 
import tornado.httpserver 
import tornado.web 
import tornado.ioloop 


class MainHandler(tornado.web.RequestHandler): 

    def prepare(self): 
     if self.request.protocol == 'http': 
      self.redirect('https://' + self.request.host, permanent=False) 

    def get(self): 
     self.write("Hello, world") 


if __name__ == "__main__": 
    application = tornado.web.Application([ 
     (r'/', MainHandler) 
    ]) 
    application.listen(80) 
    http_server = tornado.httpserver.HTTPServer(
     application, 
     ssl_options = { 
      "certfile": os.path.join("/var/pyTest/keys/", "cert.pem"), 
      "keyfile": os.path.join("/var/pyTest/keys/", "key.pem"), 
     } 
    ) 
    http_server.listen(443) 
    tornado.ioloop.IOLoop.current().start() 
Смежные вопросы