Configure Azure Container App HTTP Route Rules

The azure-native:app:HttpRouteConfig resource, part of the Pulumi Azure Native provider, defines advanced ingress routing rules for Container App Environments: path matching, URL rewriting, and traffic distribution to container app revisions or labels. This guide focuses on three capabilities: path-based routing with prefix rewriting, custom domain configuration with TLS, and targeting specific revisions or traffic labels.

Route configs belong to a Container App Environment and reference existing container apps, revisions, traffic labels, and TLS certificates. The examples are intentionally small. Combine them with your own container apps and environment infrastructure.

Route traffic with path matching and prefix rewriting

Microservices architectures often route incoming requests to specific container app revisions based on URL paths, rewriting those paths before they reach the backend.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const httpRouteConfig = new azure_native.app.HttpRouteConfig("httpRouteConfig", {
    environmentName: "testcontainerenv",
    httpRouteName: "httproutefriendlyname",
    properties: {
        customDomains: [{
            bindingType: azure_native.app.BindingType.SniEnabled,
            certificateId: "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1",
            name: "example.com",
        }],
        rules: [{
            description: "random-description",
            routes: [{
                action: {
                    prefixRewrite: "/v1/api",
                },
                match: {
                    caseSensitive: true,
                    path: "/v1",
                },
            }],
            targets: [{
                containerApp: "capp-1",
                revision: "rev-1",
                weight: 100,
            }],
        }],
    },
    resourceGroupName: "examplerg",
});
import pulumi
import pulumi_azure_native as azure_native

http_route_config = azure_native.app.HttpRouteConfig("httpRouteConfig",
    environment_name="testcontainerenv",
    http_route_name="httproutefriendlyname",
    properties={
        "custom_domains": [{
            "binding_type": azure_native.app.BindingType.SNI_ENABLED,
            "certificate_id": "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1",
            "name": "example.com",
        }],
        "rules": [{
            "description": "random-description",
            "routes": [{
                "action": {
                    "prefix_rewrite": "/v1/api",
                },
                "match": {
                    "case_sensitive": True,
                    "path": "/v1",
                },
            }],
            "targets": [{
                "container_app": "capp-1",
                "revision": "rev-1",
                "weight": 100,
            }],
        }],
    },
    resource_group_name="examplerg")
package main

import (
	app "github.com/pulumi/pulumi-azure-native-sdk/app/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := app.NewHttpRouteConfig(ctx, "httpRouteConfig", &app.HttpRouteConfigArgs{
			EnvironmentName: pulumi.String("testcontainerenv"),
			HttpRouteName:   pulumi.String("httproutefriendlyname"),
			Properties: &app.HttpRouteConfigPropertiesArgs{
				CustomDomains: app.CustomDomainArray{
					&app.CustomDomainArgs{
						BindingType:   pulumi.String(app.BindingTypeSniEnabled),
						CertificateId: pulumi.String("/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1"),
						Name:          pulumi.String("example.com"),
					},
				},
				Rules: app.HttpRouteRuleArray{
					&app.HttpRouteRuleArgs{
						Description: pulumi.String("random-description"),
						Routes: app.HttpRouteArray{
							&app.HttpRouteArgs{
								Action: &app.HttpRouteActionArgs{
									PrefixRewrite: pulumi.String("/v1/api"),
								},
								Match: &app.HttpRouteMatchArgs{
									CaseSensitive: pulumi.Bool(true),
									Path:          pulumi.String("/v1"),
								},
							},
						},
						Targets: app.HttpRouteTargetArray{
							&app.HttpRouteTargetArgs{
								ContainerApp: pulumi.String("capp-1"),
								Revision:     pulumi.String("rev-1"),
								Weight:       pulumi.Int(100),
							},
						},
					},
				},
			},
			ResourceGroupName: pulumi.String("examplerg"),
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;

return await Deployment.RunAsync(() => 
{
    var httpRouteConfig = new AzureNative.App.HttpRouteConfig("httpRouteConfig", new()
    {
        EnvironmentName = "testcontainerenv",
        HttpRouteName = "httproutefriendlyname",
        Properties = new AzureNative.App.Inputs.HttpRouteConfigPropertiesArgs
        {
            CustomDomains = new[]
            {
                new AzureNative.App.Inputs.CustomDomainArgs
                {
                    BindingType = AzureNative.App.BindingType.SniEnabled,
                    CertificateId = "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1",
                    Name = "example.com",
                },
            },
            Rules = new[]
            {
                new AzureNative.App.Inputs.HttpRouteRuleArgs
                {
                    Description = "random-description",
                    Routes = new[]
                    {
                        new AzureNative.App.Inputs.HttpRouteArgs
                        {
                            Action = new AzureNative.App.Inputs.HttpRouteActionArgs
                            {
                                PrefixRewrite = "/v1/api",
                            },
                            Match = new AzureNative.App.Inputs.HttpRouteMatchArgs
                            {
                                CaseSensitive = true,
                                Path = "/v1",
                            },
                        },
                    },
                    Targets = new[]
                    {
                        new AzureNative.App.Inputs.HttpRouteTargetArgs
                        {
                            ContainerApp = "capp-1",
                            Revision = "rev-1",
                            Weight = 100,
                        },
                    },
                },
            },
        },
        ResourceGroupName = "examplerg",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.app.HttpRouteConfig;
import com.pulumi.azurenative.app.HttpRouteConfigArgs;
import com.pulumi.azurenative.app.inputs.HttpRouteConfigPropertiesArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var httpRouteConfig = new HttpRouteConfig("httpRouteConfig", HttpRouteConfigArgs.builder()
            .environmentName("testcontainerenv")
            .httpRouteName("httproutefriendlyname")
            .properties(HttpRouteConfigPropertiesArgs.builder()
                .customDomains(CustomDomainArgs.builder()
                    .bindingType("SniEnabled")
                    .certificateId("/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1")
                    .name("example.com")
                    .build())
                .rules(HttpRouteRuleArgs.builder()
                    .description("random-description")
                    .routes(HttpRouteArgs.builder()
                        .action(HttpRouteActionArgs.builder()
                            .prefixRewrite("/v1/api")
                            .build())
                        .match(HttpRouteMatchArgs.builder()
                            .caseSensitive(true)
                            .path("/v1")
                            .build())
                        .build())
                    .targets(HttpRouteTargetArgs.builder()
                        .containerApp("capp-1")
                        .revision("rev-1")
                        .weight(100)
                        .build())
                    .build())
                .build())
            .resourceGroupName("examplerg")
            .build());

    }
}
resources:
  httpRouteConfig:
    type: azure-native:app:HttpRouteConfig
    properties:
      environmentName: testcontainerenv
      httpRouteName: httproutefriendlyname
      properties:
        customDomains:
          - bindingType: SniEnabled
            certificateId: /subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1
            name: example.com
        rules:
          - description: random-description
            routes:
              - action:
                  prefixRewrite: /v1/api
                match:
                  caseSensitive: true
                  path: /v1
            targets:
              - containerApp: capp-1
                revision: rev-1
                weight: 100
      resourceGroupName: examplerg

When a request arrives, the match block evaluates the incoming path. If it matches /v1 (case-sensitive), the action block rewrites it to /v1/api before forwarding to the target. The targets array specifies which container app and revision receive the traffic, with weight controlling traffic distribution. The customDomains block binds a TLS certificate to example.com, enabling HTTPS with SNI.

Route with path-separated prefix matching

Path-separated prefix matching treats path segments as distinct units, ensuring /v1 matches /v1/users but not /v1users.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const httpRouteConfig = new azure_native.app.HttpRouteConfig("httpRouteConfig", {
    environmentName: "testcontainerenv",
    httpRouteName: "httproutefriendlyname",
    properties: {
        customDomains: [{
            bindingType: azure_native.app.BindingType.Disabled,
            certificateId: "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1",
            name: "example.com",
        }],
        rules: [{
            description: "random-description",
            routes: [{
                action: {
                    prefixRewrite: "/v1/api",
                },
                match: {
                    caseSensitive: true,
                    pathSeparatedPrefix: "/v1",
                },
            }],
            targets: [{
                containerApp: "capp-1",
                label: "label-1",
            }],
        }],
    },
    resourceGroupName: "examplerg",
});
import pulumi
import pulumi_azure_native as azure_native

http_route_config = azure_native.app.HttpRouteConfig("httpRouteConfig",
    environment_name="testcontainerenv",
    http_route_name="httproutefriendlyname",
    properties={
        "custom_domains": [{
            "binding_type": azure_native.app.BindingType.DISABLED,
            "certificate_id": "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1",
            "name": "example.com",
        }],
        "rules": [{
            "description": "random-description",
            "routes": [{
                "action": {
                    "prefix_rewrite": "/v1/api",
                },
                "match": {
                    "case_sensitive": True,
                    "path_separated_prefix": "/v1",
                },
            }],
            "targets": [{
                "container_app": "capp-1",
                "label": "label-1",
            }],
        }],
    },
    resource_group_name="examplerg")
package main

import (
	app "github.com/pulumi/pulumi-azure-native-sdk/app/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := app.NewHttpRouteConfig(ctx, "httpRouteConfig", &app.HttpRouteConfigArgs{
			EnvironmentName: pulumi.String("testcontainerenv"),
			HttpRouteName:   pulumi.String("httproutefriendlyname"),
			Properties: &app.HttpRouteConfigPropertiesArgs{
				CustomDomains: app.CustomDomainArray{
					&app.CustomDomainArgs{
						BindingType:   pulumi.String(app.BindingTypeDisabled),
						CertificateId: pulumi.String("/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1"),
						Name:          pulumi.String("example.com"),
					},
				},
				Rules: app.HttpRouteRuleArray{
					&app.HttpRouteRuleArgs{
						Description: pulumi.String("random-description"),
						Routes: app.HttpRouteArray{
							&app.HttpRouteArgs{
								Action: &app.HttpRouteActionArgs{
									PrefixRewrite: pulumi.String("/v1/api"),
								},
								Match: &app.HttpRouteMatchArgs{
									CaseSensitive:       pulumi.Bool(true),
									PathSeparatedPrefix: pulumi.String("/v1"),
								},
							},
						},
						Targets: app.HttpRouteTargetArray{
							&app.HttpRouteTargetArgs{
								ContainerApp: pulumi.String("capp-1"),
								Label:        pulumi.String("label-1"),
							},
						},
					},
				},
			},
			ResourceGroupName: pulumi.String("examplerg"),
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;

return await Deployment.RunAsync(() => 
{
    var httpRouteConfig = new AzureNative.App.HttpRouteConfig("httpRouteConfig", new()
    {
        EnvironmentName = "testcontainerenv",
        HttpRouteName = "httproutefriendlyname",
        Properties = new AzureNative.App.Inputs.HttpRouteConfigPropertiesArgs
        {
            CustomDomains = new[]
            {
                new AzureNative.App.Inputs.CustomDomainArgs
                {
                    BindingType = AzureNative.App.BindingType.Disabled,
                    CertificateId = "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1",
                    Name = "example.com",
                },
            },
            Rules = new[]
            {
                new AzureNative.App.Inputs.HttpRouteRuleArgs
                {
                    Description = "random-description",
                    Routes = new[]
                    {
                        new AzureNative.App.Inputs.HttpRouteArgs
                        {
                            Action = new AzureNative.App.Inputs.HttpRouteActionArgs
                            {
                                PrefixRewrite = "/v1/api",
                            },
                            Match = new AzureNative.App.Inputs.HttpRouteMatchArgs
                            {
                                CaseSensitive = true,
                                PathSeparatedPrefix = "/v1",
                            },
                        },
                    },
                    Targets = new[]
                    {
                        new AzureNative.App.Inputs.HttpRouteTargetArgs
                        {
                            ContainerApp = "capp-1",
                            Label = "label-1",
                        },
                    },
                },
            },
        },
        ResourceGroupName = "examplerg",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.app.HttpRouteConfig;
import com.pulumi.azurenative.app.HttpRouteConfigArgs;
import com.pulumi.azurenative.app.inputs.HttpRouteConfigPropertiesArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var httpRouteConfig = new HttpRouteConfig("httpRouteConfig", HttpRouteConfigArgs.builder()
            .environmentName("testcontainerenv")
            .httpRouteName("httproutefriendlyname")
            .properties(HttpRouteConfigPropertiesArgs.builder()
                .customDomains(CustomDomainArgs.builder()
                    .bindingType("Disabled")
                    .certificateId("/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1")
                    .name("example.com")
                    .build())
                .rules(HttpRouteRuleArgs.builder()
                    .description("random-description")
                    .routes(HttpRouteArgs.builder()
                        .action(HttpRouteActionArgs.builder()
                            .prefixRewrite("/v1/api")
                            .build())
                        .match(HttpRouteMatchArgs.builder()
                            .caseSensitive(true)
                            .pathSeparatedPrefix("/v1")
                            .build())
                        .build())
                    .targets(HttpRouteTargetArgs.builder()
                        .containerApp("capp-1")
                        .label("label-1")
                        .build())
                    .build())
                .build())
            .resourceGroupName("examplerg")
            .build());

    }
}
resources:
  httpRouteConfig:
    type: azure-native:app:HttpRouteConfig
    properties:
      environmentName: testcontainerenv
      httpRouteName: httproutefriendlyname
      properties:
        customDomains:
          - bindingType: Disabled
            certificateId: /subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1
            name: example.com
        rules:
          - description: random-description
            routes:
              - action:
                  prefixRewrite: /v1/api
                match:
                  caseSensitive: true
                  pathSeparatedPrefix: /v1
            targets:
              - containerApp: capp-1
                label: label-1
      resourceGroupName: examplerg

The pathSeparatedPrefix property evaluates paths segment-by-segment rather than as raw strings. This example routes to a traffic label instead of a specific revision, allowing you to shift traffic between revisions without updating the route config. The bindingType is set to Disabled, meaning the custom domain accepts HTTP traffic without enforcing TLS.

Route with simple prefix matching

Simple prefix matching evaluates paths as raw strings, providing straightforward routing without segment-aware logic.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const httpRouteConfig = new azure_native.app.HttpRouteConfig("httpRouteConfig", {
    environmentName: "testcontainerenv",
    httpRouteName: "httproutefriendlyname",
    properties: {
        customDomains: [{
            bindingType: azure_native.app.BindingType.Disabled,
            certificateId: "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1",
            name: "example.com",
        }],
        rules: [{
            description: "random-description",
            routes: [{
                action: {
                    prefixRewrite: "/v1/api",
                },
                match: {
                    caseSensitive: true,
                    prefix: "/v1",
                },
            }],
            targets: [{
                containerApp: "capp-1",
                label: "label-1",
            }],
        }],
    },
    resourceGroupName: "examplerg",
});
import pulumi
import pulumi_azure_native as azure_native

http_route_config = azure_native.app.HttpRouteConfig("httpRouteConfig",
    environment_name="testcontainerenv",
    http_route_name="httproutefriendlyname",
    properties={
        "custom_domains": [{
            "binding_type": azure_native.app.BindingType.DISABLED,
            "certificate_id": "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1",
            "name": "example.com",
        }],
        "rules": [{
            "description": "random-description",
            "routes": [{
                "action": {
                    "prefix_rewrite": "/v1/api",
                },
                "match": {
                    "case_sensitive": True,
                    "prefix": "/v1",
                },
            }],
            "targets": [{
                "container_app": "capp-1",
                "label": "label-1",
            }],
        }],
    },
    resource_group_name="examplerg")
package main

import (
	app "github.com/pulumi/pulumi-azure-native-sdk/app/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := app.NewHttpRouteConfig(ctx, "httpRouteConfig", &app.HttpRouteConfigArgs{
			EnvironmentName: pulumi.String("testcontainerenv"),
			HttpRouteName:   pulumi.String("httproutefriendlyname"),
			Properties: &app.HttpRouteConfigPropertiesArgs{
				CustomDomains: app.CustomDomainArray{
					&app.CustomDomainArgs{
						BindingType:   pulumi.String(app.BindingTypeDisabled),
						CertificateId: pulumi.String("/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1"),
						Name:          pulumi.String("example.com"),
					},
				},
				Rules: app.HttpRouteRuleArray{
					&app.HttpRouteRuleArgs{
						Description: pulumi.String("random-description"),
						Routes: app.HttpRouteArray{
							&app.HttpRouteArgs{
								Action: &app.HttpRouteActionArgs{
									PrefixRewrite: pulumi.String("/v1/api"),
								},
								Match: &app.HttpRouteMatchArgs{
									CaseSensitive: pulumi.Bool(true),
									Prefix:        pulumi.String("/v1"),
								},
							},
						},
						Targets: app.HttpRouteTargetArray{
							&app.HttpRouteTargetArgs{
								ContainerApp: pulumi.String("capp-1"),
								Label:        pulumi.String("label-1"),
							},
						},
					},
				},
			},
			ResourceGroupName: pulumi.String("examplerg"),
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;

return await Deployment.RunAsync(() => 
{
    var httpRouteConfig = new AzureNative.App.HttpRouteConfig("httpRouteConfig", new()
    {
        EnvironmentName = "testcontainerenv",
        HttpRouteName = "httproutefriendlyname",
        Properties = new AzureNative.App.Inputs.HttpRouteConfigPropertiesArgs
        {
            CustomDomains = new[]
            {
                new AzureNative.App.Inputs.CustomDomainArgs
                {
                    BindingType = AzureNative.App.BindingType.Disabled,
                    CertificateId = "/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1",
                    Name = "example.com",
                },
            },
            Rules = new[]
            {
                new AzureNative.App.Inputs.HttpRouteRuleArgs
                {
                    Description = "random-description",
                    Routes = new[]
                    {
                        new AzureNative.App.Inputs.HttpRouteArgs
                        {
                            Action = new AzureNative.App.Inputs.HttpRouteActionArgs
                            {
                                PrefixRewrite = "/v1/api",
                            },
                            Match = new AzureNative.App.Inputs.HttpRouteMatchArgs
                            {
                                CaseSensitive = true,
                                Prefix = "/v1",
                            },
                        },
                    },
                    Targets = new[]
                    {
                        new AzureNative.App.Inputs.HttpRouteTargetArgs
                        {
                            ContainerApp = "capp-1",
                            Label = "label-1",
                        },
                    },
                },
            },
        },
        ResourceGroupName = "examplerg",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.app.HttpRouteConfig;
import com.pulumi.azurenative.app.HttpRouteConfigArgs;
import com.pulumi.azurenative.app.inputs.HttpRouteConfigPropertiesArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var httpRouteConfig = new HttpRouteConfig("httpRouteConfig", HttpRouteConfigArgs.builder()
            .environmentName("testcontainerenv")
            .httpRouteName("httproutefriendlyname")
            .properties(HttpRouteConfigPropertiesArgs.builder()
                .customDomains(CustomDomainArgs.builder()
                    .bindingType("Disabled")
                    .certificateId("/subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1")
                    .name("example.com")
                    .build())
                .rules(HttpRouteRuleArgs.builder()
                    .description("random-description")
                    .routes(HttpRouteArgs.builder()
                        .action(HttpRouteActionArgs.builder()
                            .prefixRewrite("/v1/api")
                            .build())
                        .match(HttpRouteMatchArgs.builder()
                            .caseSensitive(true)
                            .prefix("/v1")
                            .build())
                        .build())
                    .targets(HttpRouteTargetArgs.builder()
                        .containerApp("capp-1")
                        .label("label-1")
                        .build())
                    .build())
                .build())
            .resourceGroupName("examplerg")
            .build());

    }
}
resources:
  httpRouteConfig:
    type: azure-native:app:HttpRouteConfig
    properties:
      environmentName: testcontainerenv
      httpRouteName: httproutefriendlyname
      properties:
        customDomains:
          - bindingType: Disabled
            certificateId: /subscriptions/34adfa4f-cedf-4dc0-ba29-b6d1a69ab345/resourceGroups/examplerg/providers/Microsoft.App/managedEnvironments/testcontainerenv/certificates/certificate-1
            name: example.com
        rules:
          - description: random-description
            routes:
              - action:
                  prefixRewrite: /v1/api
                match:
                  caseSensitive: true
                  prefix: /v1
            targets:
              - containerApp: capp-1
                label: label-1
      resourceGroupName: examplerg

The prefix property performs string-based matching. Unlike pathSeparatedPrefix, this matches any path starting with /v1, including /v1users. This example also uses label-based targeting, demonstrating an alternative to revision-specific routing.

Beyond these examples

These snippets focus on specific route config features: path-based routing with rewriting, custom domain and TLS binding, and revision and label-based traffic targeting. They’re intentionally minimal rather than full ingress configurations.

The examples reference pre-existing infrastructure such as Container App Environments, container apps with revisions or traffic labels, and TLS certificates in the managed environment. They focus on configuring the route rather than provisioning the surrounding infrastructure.

To keep things focused, common routing patterns are omitted, including:

  • Header-based routing (match.headers)
  • Query parameter matching (match.queryParameters)
  • Multiple route rules per configuration
  • Traffic splitting across multiple targets (weight distribution)

These omissions are intentional: the goal is to illustrate how each routing feature is wired, not provide drop-in ingress modules. See the HttpRouteConfig resource reference for all available configuration options.

Let's configure Azure Container App HTTP Route Rules

Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.

Try Pulumi Cloud for FREE

Frequently Asked Questions

Resource Configuration & Immutability
What properties can't I change after creating an HTTP route config?
The environmentName, httpRouteName, and resourceGroupName properties are immutable. Changing any of these requires replacing the resource.
Path Matching & Routing
What's the difference between path, prefix, and pathSeparatedPrefix matching?
You have three matching options in the match object: path for exact path matching, prefix for prefix-based matching, and pathSeparatedPrefix for path-separated prefix matching. All support the caseSensitive option.
How do I rewrite incoming URL paths?
Use prefixRewrite in the action object to transform incoming paths. For example, you can rewrite requests from /v1 to /v1/api.
Custom Domains & SSL
How do I configure custom domains with or without SSL?
Configure customDomains with bindingType set to SniEnabled for SSL/TLS or Disabled for HTTP only. Include the certificateId (path to your managed certificate) and domain name.
Traffic Distribution
Can I route traffic to specific container app revisions or labels?
Yes, configure targets with either revision and weight for traffic splitting across revisions, or use label to route to a specific labeled revision.

Using a different cloud?

Explore networking guides for other cloud providers: