Support secure same-origin API URLs
This commit is contained in:
20
README.md
20
README.md
@@ -160,6 +160,26 @@ If the browser shows a CORS error, make sure the exact frontend origin is in
|
|||||||
FRONTEND_ORIGINS=https://plasttrack.sable.ynsdev.site
|
FRONTEND_ORIGINS=https://plasttrack.sable.ynsdev.site
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If the frontend is served over HTTPS, the WebSocket URL must use `wss://`, not
|
||||||
|
`ws://`. Browsers block insecure WebSockets from secure pages. Recommended
|
||||||
|
same-domain reverse proxy variables:
|
||||||
|
|
||||||
|
```env
|
||||||
|
FRONTEND_ORIGIN=https://plasttrack.sable.ynsdev.site
|
||||||
|
FRONTEND_ORIGINS=https://plasttrack.sable.ynsdev.site
|
||||||
|
VITE_API_BASE_URL=https://plasttrack.sable.ynsdev.site
|
||||||
|
VITE_WS_URL=wss://plasttrack.sable.ynsdev.site/ws/dashboard
|
||||||
|
VITE_ALLOWED_HOSTS=plasttrack.sable.ynsdev.site,localhost,127.0.0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
The reverse proxy must route:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/api/* -> backend:8000
|
||||||
|
/ws/dashboard -> backend:8000
|
||||||
|
/* -> frontend:5173
|
||||||
|
```
|
||||||
|
|
||||||
### 3. Deploy
|
### 3. Deploy
|
||||||
|
|
||||||
Click `Deploy the stack`.
|
Click `Deploy the stack`.
|
||||||
|
|||||||
@@ -1,5 +1,28 @@
|
|||||||
export const API_BASE_URL = import.meta.env.VITE_API_BASE_URL ?? "http://localhost:8000";
|
function resolveApiBaseUrl() {
|
||||||
export const WS_URL = import.meta.env.VITE_WS_URL ?? "ws://localhost:8000/ws/dashboard";
|
const configuredUrl = import.meta.env.VITE_API_BASE_URL;
|
||||||
|
if (configuredUrl) {
|
||||||
|
return configuredUrl;
|
||||||
|
}
|
||||||
|
if (typeof window === "undefined") {
|
||||||
|
return "http://localhost:8000";
|
||||||
|
}
|
||||||
|
return window.location.origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveWsUrl() {
|
||||||
|
const configuredUrl = import.meta.env.VITE_WS_URL;
|
||||||
|
if (configuredUrl) {
|
||||||
|
return configuredUrl;
|
||||||
|
}
|
||||||
|
if (typeof window === "undefined") {
|
||||||
|
return "ws://localhost:8000/ws/dashboard";
|
||||||
|
}
|
||||||
|
const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
|
||||||
|
return `${protocol}//${window.location.host}/ws/dashboard`;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const API_BASE_URL = resolveApiBaseUrl();
|
||||||
|
export const WS_URL = resolveWsUrl();
|
||||||
|
|
||||||
export async function fetchJson<T>(path: string, init?: RequestInit): Promise<T> {
|
export async function fetchJson<T>(path: string, init?: RequestInit): Promise<T> {
|
||||||
const response = await fetch(`${API_BASE_URL}${path}`, {
|
const response = await fetch(`${API_BASE_URL}${path}`, {
|
||||||
|
|||||||
Reference in New Issue
Block a user