feat(app): add frontend url configuration

This commit is contained in:
MingxuanGame
2025-08-12 09:01:10 +00:00
parent 0dd0d8f7ba
commit e70c197d65
6 changed files with 33 additions and 0 deletions

View File

@@ -22,6 +22,8 @@ PORT=8000
SERVER_URL="http://localhost:8000"
# 额外的 CORS 允许的域名列表
CORS_URLS='[]'
# 前端 URL当访问从游戏打开的 URL 时会重定向到这个 URL为空表示不重定向
FRONTEND_URL
# 调试模式,生产环境请设置为 false
DEBUG=false
# 私有 API 密钥,用于前后端 API 调用,使用 openssl rand -hex 32 生成

View File

@@ -70,6 +70,7 @@ docker-compose -f docker-compose-osurx.yml up -d
| `DEBUG` | 调试模式 | `false` |
| `SERVER_URL` | 服务器 URL | `http://localhost:8000` |
| `CORS_URLS` | 额外的 CORS 允许的域名列表 (JSON 格式) | `[]` |
| `FRONTEND_URL` | 前端 URL当访问从游戏打开的 URL 时会重定向到这个 URL为空表示不重定向 | `` |
| `PRIVATE_API_SECRET` | 私有 API 密钥,用于前后端 API 调用 | `your_private_api_secret_here` |
### OAuth 设置

View File

@@ -67,6 +67,7 @@ class Settings(BaseSettings):
private_api_secret: str = "your_private_api_secret_here"
cors_urls: list[HttpUrl] = []
server_url: HttpUrl = HttpUrl("http://localhost:8000")
frontend_url: HttpUrl | None = None
# SignalR 设置
signalr_negotiate_timeout: int = 30

View File

@@ -6,6 +6,7 @@ from .auth import router as auth_router
from .fetcher import fetcher_router as fetcher_router
from .file import file_router as file_router
from .private import private_router as private_router
from .redirect import redirect_router as redirect_router
from .v2.router import router as api_v2_router
__all__ = [
@@ -14,5 +15,6 @@ __all__ = [
"fetcher_router",
"file_router",
"private_router",
"redirect_router",
"signalr_router",
]

23
app/router/redirect.py Normal file
View File

@@ -0,0 +1,23 @@
from __future__ import annotations
import urllib.parse
from app.config import settings
from fastapi import APIRouter, Request
from fastapi.responses import RedirectResponse
redirect_router = APIRouter(include_in_schema=False)
@redirect_router.get("/users/{user_id}")
@redirect_router.get("/u/{user_id}")
@redirect_router.get("/b/{beatmap_id}")
@redirect_router.get("/s/{beatmapset_id}")
@redirect_router.get("/beatmapsets/{path:path}")
@redirect_router.get("/multiplayer/rooms/{room_id}")
async def redirect(request: Request):
return RedirectResponse(
urllib.parse.urljoin(str(settings.frontend_url), request.url.path),
status_code=301,
)

View File

@@ -16,6 +16,7 @@ from app.router import (
private_router,
signalr_router,
)
from app.router.redirect import redirect_router
from app.service.daily_challenge import daily_challenge_job
from app.service.osu_rx_statistics import create_rx_statistics
@@ -60,6 +61,9 @@ app.add_middleware(
allow_headers=["*"],
)
if settings.frontend_url is not None:
app.include_router(redirect_router)
@app.get("/", include_in_schema=False)
async def root():