部署在AWS EC2的Flask应用配置SSL后异常求助
解决方案
一、Flask 核心配置修正
- 设置
SERVER_NAME:明确告知Flask你的正式域名,避免生成EC2实例地址的链接app.config['SERVER_NAME'] = 'your-domain.com' - 强制HTTPS协议:确保Flask生成的所有链接都使用HTTPS
app.config['PREFERRED_URL_SCHEME'] = 'https' - 检查登录重定向逻辑:所有重定向必须使用
url_for生成,禁止硬编码EC2公网DNS地址,例如:# 正确写法 return redirect(url_for('dashboard')) # 错误写法(禁止使用) # return redirect('http://ec2-xxx.compute.amazonaws.com/dashboard')
二、Nginx 反向代理配置调整
Nginx必须正确传递请求的主机头和协议信息,否则Flask无法识别用户的真实访问域名。示例配置如下:
server { listen 80; server_name your-domain.com; location / { proxy_pass http://127.0.0.1:5000; # Flask应用运行的本地地址 proxy_set_header Host $host; # 关键:传递用户访问的域名主机头 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 传递请求使用的协议(HTTP/HTTPS) } }
配置完成后重启Nginx生效:
sudo systemctl restart nginx
三、CloudFront 转发设置检查
由于使用CloudFront作为CDN,需确保它正确转发关键请求头到EC2实例:
- 进入CloudFront分发的行为设置,编辑对应路径行为:
- 勾选转发所有请求头,或至少单独转发
Host、X-Forwarded-Proto头; - 动态内容建议选择缓存策略:CachingDisabled,避免缓存登录、导航等动态页面。
- 勾选转发所有请求头,或至少单独转发
- 检查CloudFront的源设置:源域名需填写EC2实例的公网DNS或弹性IP对应的域名,无需添加端口(Nginx在80端口监听)。
四、导航栏消失问题排查
导航栏消失通常是静态资源加载失败导致,需检查:
- 静态资源链接是否使用
url_for生成,例如:<link rel="stylesheet" href="{{ url_for('static', filename='css/navbar.css') }}"> - 若静态资源托管在S3+CloudFront,需确保资源URL为HTTPS协议的正式域名地址,而非EC2实例地址。
内容的提问来源于stack exchange,提问作者DiggyDuggy
相关产品推荐
相关产品推荐

