Как реализовать SSL (с http на https) с помощью Flask, Flask-SocketIO и nginx

Мое приложение использует Flask-Socketio, Flask и nginx. Я прочитал в сообщении, что вся обработка HTTP-HTTPS должна выполняться на уровне веб-сервера, а не на уровне сервера приложений. Я использовал атрибут rewrite для перенаправления всех HTTP-запросов как HTTPS-запросов. Это успешно работает со статическими страницами. Однако, когда я пытаюсь загрузить динамический контент, я получаю сообщение об ошибке The page at 'https://localhost/myLoc' was loaded over HTTPS, but displayed insecure content from 'http://localhost/myLoc/more/paths?t=1390397': this content should also be loaded over HTTPS..

Далее я также получаю эту ошибку XMLHttpRequest cannot load http://localhost/myLoc/more/paths?t=1390397. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://localhost' is therefore not allowed access.

Мой файл nginx.conf выглядит так

server {
    server {
    listen       80;
    server_name  _;
   rewrite ^ https://$host$request_uri? permanent;
}

server {
    gzip  on;
    ssl     on;
    listen 443 ssl;

    server_name     *.mydomain.com;

    ssl_certificate /path/to/nginx/ssl/nginx.crt;
    ssl_certificate_key /path/to/nginx/ssl/nginx.key;

    location /myLoc {
            proxy_pass http://localhost:9001/myLoc;
            proxy_redirect off;
            proxy_buffering off;

            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Пожалуйста помоги. Должен ли Flask-SocketIO также содержать пути к сертификату и ключу?


person Neeleshkumar S    schedule 06.11.2014    source источник
comment
Вы загружаете сторонний контент, такой как jQuery?   -  person dirn    schedule 06.11.2014
comment
Как вы ссылаетесь на свой контент? Похоже, что вы можете явно получать ресурс по адресу http://localhost/myLoc/more/paths?t=1390397, когда он должен быть относительным (без домена, например, /myLoc/more/paths?t=1390397) или относительно протокола (без схемы, например, //localhost/myLoc/more/paths?t=1390397); в идеале это должно быть сделано с использованием url_for вместо жестко закодированного. Вам также может потребоваться установить заголовок X-Forwaded-Proto в блоке местоположения и добавить промежуточное ПО ProxyFix на этот ответ< /а>.   -  person jonafato    schedule 06.11.2014
comment
@dim: Да, мы используем JavaScript и jQuery.   -  person Neeleshkumar S    schedule 11.11.2014


Ответы (1)


Попробуй это:

location /myLoc {
        proxy_pass https://localhost:9001/myLoc;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        add_header Access-Control-Allow-Origin *;
}

Но разгрузка HTTPS предпочтительнее, директива proxy_pass http:// лучше, она помогает Nginx как можно быстрее получить ответ от бэкенда и закрыть соединение. Единственное требование — серверная часть (которая слушает порт 9901) обслуживала HTTP.

person Anatoly    schedule 09.11.2014