This is an automated email from the ASF dual-hosted git repository.
jscheffl pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new af239855e76 Fix edge executor UI navigation when behind reverse proxy
with subpath (#63777)
af239855e76 is described below
commit af239855e76fbf076fe226ee5fb044ab4965cef5
Author: Dheeraj Turaga <[email protected]>
AuthorDate: Tue Mar 17 14:38:22 2026 -0500
Fix edge executor UI navigation when behind reverse proxy with subpath
(#63777)
The /api/v2/version call in NavTabs used a hardcoded absolute path,
which 404s when Airflow is served under a subpath (e.g. /airflow/).
This prevented the nav tabs from rendering, forcing users to navigate
via inline table links that lacked relative=path, causing URLs to
append instead of replace (e.g. /worker/jobs/worker/...).
---
.../src/airflow/providers/edge3/plugins/www/src/layouts/NavTabs.tsx | 3 ++-
.../src/airflow/providers/edge3/plugins/www/src/pages/JobsPage.tsx | 2 +-
.../src/airflow/providers/edge3/plugins/www/src/pages/WorkerPage.tsx | 4 ++--
3 files changed, 5 insertions(+), 4 deletions(-)
diff --git
a/providers/edge3/src/airflow/providers/edge3/plugins/www/src/layouts/NavTabs.tsx
b/providers/edge3/src/airflow/providers/edge3/plugins/www/src/layouts/NavTabs.tsx
index 070ad2a2643..6e534647f51 100644
---
a/providers/edge3/src/airflow/providers/edge3/plugins/www/src/layouts/NavTabs.tsx
+++
b/providers/edge3/src/airflow/providers/edge3/plugins/www/src/layouts/NavTabs.tsx
@@ -19,6 +19,7 @@
import { Center, Flex } from "@chakra-ui/react";
import axios from "axios";
import { useQuery } from "@tanstack/react-query";
+import { OpenAPI } from "openapi/requests/core/OpenAPI";
import { useRef, type ReactNode } from "react";
import { NavLink } from "react-router-dom";
@@ -34,7 +35,7 @@ export const NavTabs = ({ tabs }: Props) => {
const { data } = useQuery<{version: string, git_version: string | null}>({
queryFn: async () => {
- const res = await axios.get("/api/v2/version");
+ const res = await axios.get(`${OpenAPI.BASE}/api/v2/version`);
return res.data;
},
queryKey: ["appVersion"],
diff --git
a/providers/edge3/src/airflow/providers/edge3/plugins/www/src/pages/JobsPage.tsx
b/providers/edge3/src/airflow/providers/edge3/plugins/www/src/pages/JobsPage.tsx
index a2ce7213a3e..cf86d89dbdb 100644
---
a/providers/edge3/src/airflow/providers/edge3/plugins/www/src/pages/JobsPage.tsx
+++
b/providers/edge3/src/airflow/providers/edge3/plugins/www/src/pages/JobsPage.tsx
@@ -240,7 +240,7 @@ export const JobsPage = () => {
{job.queued_dttm ? <TimeAgo date={job.queued_dttm}
live={false} /> : undefined}
</Table.Cell>
<Table.Cell>
- <Link
to={`../worker#${job.edge_worker}`}>{job.edge_worker}</Link>
+ <Link relative="path"
to={`../worker#${job.edge_worker}`}>{job.edge_worker}</Link>
</Table.Cell>
<Table.Cell>
{job.last_update ? <TimeAgo date={job.last_update}
live={false} /> : undefined}
diff --git
a/providers/edge3/src/airflow/providers/edge3/plugins/www/src/pages/WorkerPage.tsx
b/providers/edge3/src/airflow/providers/edge3/plugins/www/src/pages/WorkerPage.tsx
index e91edee97e3..6f1758f2ef3 100644
---
a/providers/edge3/src/airflow/providers/edge3/plugins/www/src/pages/WorkerPage.tsx
+++
b/providers/edge3/src/airflow/providers/edge3/plugins/www/src/pages/WorkerPage.tsx
@@ -163,7 +163,7 @@ export const WorkerPage = () => {
<List.Root>
{worker.queues.map((queue) => (
<List.Item key={queue}>
- <Link
to={`../jobs?queue=${encodeURIComponent(queue)}`}>{queue}</Link>
+ <Link relative="path"
to={`../jobs?queue=${encodeURIComponent(queue)}`}>{queue}</Link>
</List.Item>
))}
</List.Root>
@@ -179,7 +179,7 @@ export const WorkerPage = () => {
</Table.Cell>
<Table.Cell>
{worker.jobs_active !== undefined && worker.jobs_active >
0 ? (
- <Link
to={`../jobs?worker=${encodeURIComponent(worker.worker_name)}`}>
+ <Link relative="path"
to={`../jobs?worker=${encodeURIComponent(worker.worker_name)}`}>
{worker.jobs_active}
</Link>
) : (