You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: aspnetcore/blazor/host-and-deploy/app-base-path.md
+29-9Lines changed: 29 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -60,19 +60,22 @@ For the sources of links that pertain to Blazor in ASP.NET Core apps:
60
60
61
61
If you're rendering a Blazor app from different documents (for example, `/Admin/B/C/` and `/Admin/D/E/`), you must take the app base path into account, or the base path is different when the app renders in each document and the resources are fetched from the wrong URLs.
62
62
63
-
There are two approaches to deal with the challenge of resolving relative links correctly:
63
+
Choose one of the following strategies to keep relative links resolving correctly:
64
64
65
-
* Map the resources dynamically using the document they were rendered on as the root.
66
-
* Set a consistent base path for the document and map the resources under that base path.
65
+
* Map resources dynamically using the document they were rendered on as the root. This requires custom routing logic (for example, <xref:Microsoft.AspNetCore.Routing.IDynamicEndpointMetadata> or a <xref:Microsoft.AspNetCore.Routing.MatcherPolicy>) and is typically reserved for highly dynamic sites.
66
+
:::moniker range=">= aspnetcore-11.0"
67
67
68
-
The first option is more complicated and isn't the most typical approach, as it makes navigation different for each document. Consider the following example for rendering a page `/Something/Else`:
68
+
* Establish a consistent base path for the document and map all app resources beneath that path. Blazor Server/Auto apps can rely on the `BasePath` component to render `<base href>` automatically, while standalone WebAssembly apps (or scenarios that always use a fixed value) configure the literal `<base>` tag in the host page.
69
69
70
-
* Rendered under `/Admin/B/C/`, the page is rendered with a path of `/Admin/B/C/Something/Else`.
71
-
* Rendered under `/Admin/D/E/`, the page is rendered ***at the same path*** of `/Admin/B/C/Something/Else`.
70
+
:::moniker-end
71
+
72
+
:::moniker range="< aspnetcore-11.0"
72
73
73
-
Under the first approach, routing offers <xref:Microsoft.AspNetCore.Routing.IDynamicEndpointMetadata> and <xref:Microsoft.AspNetCore.Routing.MatcherPolicy>, which in combination can be the basis for implementing a completely dynamic solution that determines at runtime about how requests are routed.
74
+
* Establish a consistent base path for the document and map all app resources beneath that path. Configure the literal `<base>` tag in the host page for both Blazor Server and WebAssembly apps (or scenarios that always use a fixed value).
75
+
76
+
:::moniker-end
74
77
75
-
For the second option, which is the usual approach taken, the app sets the basepath in the document and maps the server endpoints to paths under the base. The following guidance adopts this approach.
78
+
The remainder of this article focuses on the consistent base-path approach.
76
79
77
80
## Server-side Blazor
78
81
@@ -126,7 +129,13 @@ By configuring the app base path, a component that isn't in the root directory c
126
129
127
130
Place the `<base>` tag in `<head>` markup ([location of `<head>` content](xref:blazor/project-structure#location-of-head-and-body-content)) before any elements with attribute values that are URLs, such as the `href` attributes of `<link>` elements.
128
131
129
-
:::moniker range=">= aspnetcore-8.0"
132
+
:::moniker range=">= aspnetcore-11.0"
133
+
134
+
In many hosting scenarios, the relative URL path to the app is the root of the app. When the app runs at `/`, `<BasePath />` renders `<base href="/" />` automatically in [`<head>` content](xref:blazor/project-structure#location-of-head-and-body-content). For any other deployment path, the component emits a `<base>` element that matches the current request's path base.
In many hosting scenarios, the relative URL path to the app is the root of the app. In these default cases, the app's relative URL base path is `/` configured as `<base href="/" />` in [`<head>` content](xref:blazor/project-structure#location-of-head-and-body-content).
132
141
@@ -145,6 +154,16 @@ In many hosting scenarios, the relative URL path to the app is the root of the a
145
154
> In some hosting scenarios, such as GitHub Pages and IIS sub-apps, the app base path must be set to the server's relative URL path of the app.
146
155
147
156
* In a server-side Blazor app, use ***either*** of the following approaches:
157
+
:::moniker range=">= aspnetcore-11.0"
158
+
* Option 1: Use the `BasePath` component to set the app's base path ([location of `<head>` content](xref:blazor/project-structure#location-of-head-and-body-content)):
159
+
160
+
```razor
161
+
<BasePath />
162
+
```
163
+
164
+
The component renders `<base href>` automatically based on the current request path base.
165
+
166
+
:::moniker range="< aspnetcore-11.0"
148
167
149
168
* Option 1: Use the `<base>` tag to set the app's base path ([location of `<head>` content](xref:blazor/project-structure#location-of-head-and-body-content)):
150
169
@@ -153,6 +172,7 @@ In many hosting scenarios, the relative URL path to the app is the root of the a
153
172
```
154
173
155
174
**The trailing slash is required.**
175
+
:::moniker-end
156
176
157
177
* Option 2: Call <xref:Microsoft.AspNetCore.Builder.UsePathBaseExtensions.UsePathBase%2A> ***first*** in the app's request processing pipeline (`Program.cs`) immediately after the <xref:Microsoft.AspNetCore.Builder.WebApplicationBuilder> is built (`builder.Build()`) to configure the base path for any following middleware that interacts with the request path:
0 commit comments