我有一个网站运行在VPS上,使用Flask 作为后端API服务器,Angular 前端,作为反向代理.我在我的Nginx上安装了SSL.问题是我可以使用HTTP连接到FlaskTM服务器,但不能使用HTTPS连接.

https://app.my-domain.com/api/login #<---- doesn't work
http://app.my-domain.com/api/login #<---- works properly

下面是我收到的错误

enter image description here

以下是我的Nginx配置

server 
{
    server_name app.my-domain.com;
    
    #expires    0;
    #add_header Cache-Control private;

    # flask backend server
    location /api/*
    {
        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;
        proxy_set_header Host $http_host;
        
    proxy_pass http://0.0.0.0:5000/;
    proxy_redirect  http://0.0.0.0:5000/ /;

    }

    #angular static files location after compilation using ng build --configuration production
    location /
    {
    expires -1;
        default_type application/javascript;
        add_header Pragma "no-cache";
        add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";

        root /root/workspace/FrontEnd/dist;
        index index.html index.htm;
        try_files $uri $uri/ /index.html =404;
    }



    access_log /var/log/nginx/my-domain.com.access.log;
    error_log /var/log/nginx/my-domain.com.error.log;

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/app.my-domain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/app.my-domain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server 
{
    if ($host = app.my-domain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    listen [::]:80;

    server_name app.domain.com;
    return 404; # managed by Certbot

}

以下是负责发出请求的Angular 代码

const header=new HttpHeaders({});

const httpOptions = {
  headers: new HttpHeaders({ 'Content-Type': 'application/json'}), withcredentials: true
}; 

@Injectable({
  providedIn: 'root',
})
export class AuthService {
  // create var res
  constructor(private http: HttpClient) {}
  private isLogged: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);

  login(email: string, password: string): Observable<any> {
    // pass var res in return
    const formData = new FormData();
    formData.append('email', email);
    formData.append('password', password);
    console.log(AUTH_API);
    return this.http.post( './api/login', formData ); #<----------
  }
}

下面是我的Flask 密码,

app = Flask(__name__, static_folder='static', template_folder='static')
gunicorn_error_logger = logging.getLogger('gunicorn.error')
app.logger.handlers.extend(gunicorn_error_logger.handlers)
app.logger.setLevel(logging.DEBUG)

db.init_app(app)
migrate = Migrate(app, db)

CORS(app, resources={r'/*': {'origins': '*'}}, supports_credentials=True)

from views import LoginPageView

app.add_url_rule('/api/login', view_func=LoginPageView.as_view('login_page', app.logger), methods=['GET','POST'])

if __name__ == '__main__':
    app.run(debug=True)

我正在使用以下命令运行FASK

gunicorn --workers 4 --bind 0.0.0.0:5000 wsgi:app --worker-class eventlet

如何确保我的所有请求都是HTTPS并且工作正常,并禁用http请求?

推荐答案

此错误通常是由于try 使用POST而不是GET访问静态文件(在本例中,可能是Angular 文件)造成的.

在我看来,location /api/*似乎是罪魁祸首.也许您指的是location ~ /api/*(启用正则表达式)或location /api/(相同效果).如果跳过这个位置块,nginx将使用下一个最好的位置块,在您的情况下,它提供的是Angular 文件.

Angular相关问答推荐

Angular 17自定义指令渲染不起作用'

如何动态呈现组件并以Angular 访问它们的方法?

Angular中的Bootstrap carousel动态属性

当元素在元素上使用迭代变量时,如何重构ngFor?

如何使用独立组件在ANGLE(16+)中实现嵌套布线

Angular 17+独立配置中main.ts bootstrap 调用的最佳实践

VS代码中带Angular 17的缩进新控制流

如何解决在StackBlitz中使用SPARTIER时出现无法解析解析器错误(&C)?

NG-Zorro Datepicker 手动输入掩码不起作用

Angular *ngIf 表达式中这么多冒号的作用是什么?

Angular 15 在 URL 中使用@进行路由

MAT折叠面板的动态开启和关闭无法工作

RxJs 中的空闲可观察对象在幕后做了什么?

Angular 项目构建仅在 GitHub Actions 上失败

无法推送 Angular 项目 - Github

Angular [disabled]="MyBoolean" 没有工作

如何在 bootstrap Angular 2 应用程序时调用休息 api

在同一个组件中使用 MatSort 的多个 mat-table

如何从materialAngular使用分页器?

Angular 2 中的动态模板 URL