使用 FastAPI 时,我的静态文件夹中的所有文件都通过 HTTP 而不是 HTTPS 提供。更清楚地说,它们不是在我的域上被切断,而是在我的网络服务器的本地主机上被切断。我假设这是我的网络服务器设置方式和 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
尝试在您的应用程序中包含所需的
ssl
配置,FastAPI
就会知道如何通过HTTPS
服务服务器。app = FastAPI(
ssl_keyfile="/path/to/your/private.key",
ssl_certfile="/path/to/your/certificate.crt"
)
您会遇到上述关于在您的网站中混合安全和不安全元素的错误。看起来你访问你的域它有所需的
SSL
证书,但是当你访问存储在本地的静态文件时,你正在从 localhsot
获取东西而不知道它们存在。 FastAPI
您配置它的方式不知道如何通过 HTTPS
提供这些文件。因此,您会遇到同时访问 https://www.example.com
和 http://localhost
的确切问题,chrome 不再支持该问题。
为了创建
FastAPI
应用程序并以安全的方式配置它,您需要在应用程序的配置中提及ssl
密钥和证书。这样,当您访问该站点时,您将拥有HTTPS
。将所需的 ssl_keyfile
和 ssl_certfile
作为参数添加到 FastAPI
构造函数应该可以解决问题。 (请看上面的代码片段)
我强烈建议您花时间深入研究该主题并在FastAPI
文档站点阅读更多关于该主题的信息。正如那里提到的:
很容易假设 HTTPS 只是“启用”或未启用。
但它比那复杂得多。
部署站点时应考虑多种因素。
根据您对错误的描述,可能是配置不正确。
出于某种原因,服务器访问
localhost
以获取站点/应用程序的徽标。当您在开发区域时这可能会起作用,但是当您进入生产环境时可能会出现问题。我希望服务器从服务器(使用域)获取所有静态文件,而无需尝试访问一些本地内容。确保服务器配置正确。
如果您正在寻找有关手动运行服务器的配置的更多示例,您可以在以下博客文章中阅读更多相关信息:
如果您有兴趣检查有关部署设置的最佳实践,
FastAPI
文档站点将是一个好的开始 - 涵盖基础知识并提供一些基本规则: