使用Python FastAPI,运行Apache的Web服务器如何通过HTTPS提供静态文件夹

syqv5f0l  于 2023-03-19  发布在  Apache
关注(0)|答案(1)|浏览(217)

当使用FastAPI时,我的静态文件夹中的所有文件都是通过HTTP而不是HTTPS提供的。更清楚地说,它们不是通过我的域提供的,而是通过我的Web服务器的本地主机提供的。我假设这是介于我的Web服务器设置和FastAPI的挂载功能之间的东西。
我使用Apache托管,有域名,静态IP和https证书。同一服务器上的Flask或NodeJS没有问题。

from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates

app = FastAPI()

templates = Jinja2Templates(directory="templates/")

app.mount("/static", StaticFiles(directory="static"), name="static")

@app.get("/home/", response_class=HTMLResponse)
async def home(request: Request):
   return templates.TemplateResponse("home.html", {"request": request})

错误:

Mixed Content:  
The page at 'https://www.<insert-domain>.com' was loaded over HTTPS,   
but requested an insecure element 'http://localhost:3000/static/logo.png'.  
This request was automatically upgraded to HTTPS,  
For more information see

https://blog.chromium.org/2019/10/no-more-mixed-messages-about-https.html

dddzy1tm

dddzy1tm1#

TL;DR

尝试在应用程序中包含所需的ssl配置,
这样,FastAPI将知道如何通过HTTPS服务服务器。
请尝试以下操作:

app = FastAPI(
    ssl_keyfile="/path/to/your/private.key",
    ssl_certfile="/path/to/your/certificate.crt"
)

出现此错误的原因

你会得到上面提到的关于在你的网站中混合安全和不安全元素的错误。看起来你访问你的域,它有所需的SSL证书,但是,当您访问本地存储的静态文件时,您将从localhsot获取内容,而不知道它们是否存在。FastAPI您配置的FastAPI不知道如何通过HTTPS提供这些文件。因此,您会遇到同时访问https://www.example.comhttp://localhost的确切问题,chrome不再支持这两个问题。

解决问题

为了创建一个FastAPI应用程序并以安全的方式配置它,您需要在应用程序的配置中提到ssl密钥和证书。这样,当您访问站点时,将HTTPS作为参数添加到FastAPI构造函数中就可以了。(请参见上面的代码片段)

HTTPS比这更复杂

我强烈建议您花些时间在FastAPI文档站点上深入研究这个主题和read more about the subject
很容易假设HTTPS只是“启用”或未启用。
但事情远比这复杂。

投入生产前的注意事项

部署站点时应考虑多个因素。
根据您对错误的描述,可能存在配置不正确的问题。
由于某种原因,服务器访问localhost以获取站点/应用程序的徽标。当您在开发区域时,这可能会起作用,但当您进入生产环境时,可能会破坏一些东西。我希望服务器从服务器(使用域)获取所有静态文件,而无需尝试访问一些本地内容。请确保服务器配置正确。

进一步阅读

如果您正在寻找一些关于手动运行服务器的配置的更多示例,您可以在以下博客文章中阅读更多信息:

如果您有兴趣查看有关部署设置的最佳实践,那么FastAPI文档站点将是一个很好的起点-它涵盖了基本知识并提供了一些基本规则:

相关问题