---
# ----------------------------------------------------------------------------
#
#     ***     AUTO GENERATED CODE    ***    Type: MMv1     ***
#
# ----------------------------------------------------------------------------
#
#     This file is automatically generated by Magic Modules and manual
#     changes will be clobbered when the file is regenerated.
#
#     Please read more about how to change this file in
#     .github/CONTRIBUTING.md.
#
# ----------------------------------------------------------------------------
subcategory: "Compute Engine"
description: |-
  UrlMaps are used to route requests to a backend service based on rules
  that you define for the host and path of an incoming URL.
---

# google\_compute\_url\_map

UrlMaps are used to route requests to a backend service based on rules
that you define for the host and path of an incoming URL.


To get more information about UrlMap, see:

* [API documentation](https://cloud.google.com/compute/docs/reference/rest/v1/urlMaps)

<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=url_map_bucket_and_service&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Url Map Bucket And Service


```hcl
resource "google_compute_url_map" "urlmap" {
  name        = "urlmap"
  description = "a description"

  default_service = google_compute_backend_bucket.static.id

  host_rule {
    hosts        = ["mysite.com"]
    path_matcher = "mysite"
  }

  host_rule {
    hosts        = ["myothersite.com"]
    path_matcher = "otherpaths"
  }

  path_matcher {
    name            = "mysite"
    default_service = google_compute_backend_bucket.static.id

    path_rule {
      paths   = ["/home"]
      service = google_compute_backend_bucket.static.id
    }

    path_rule {
      paths   = ["/login"]
      service = google_compute_backend_service.login.id
    }

    path_rule {
      paths   = ["/static"]
      service = google_compute_backend_bucket.static.id
    }
  }

  path_matcher {
    name            = "otherpaths"
    default_service = google_compute_backend_bucket.static.id
  }

  test {
    service = google_compute_backend_bucket.static.id
    host    = "example.com"
    path    = "/home"
  }
}

resource "google_compute_backend_service" "login" {
  name        = "login"
  port_name   = "http"
  protocol    = "HTTP"
  timeout_sec = 10

  health_checks = [google_compute_http_health_check.default.id]
}

resource "google_compute_http_health_check" "default" {
  name               = "health-check"
  request_path       = "/"
  check_interval_sec = 1
  timeout_sec        = 1
}

resource "google_compute_backend_bucket" "static" {
  name        = "static-asset-backend-bucket"
  bucket_name = google_storage_bucket.static.name
  enable_cdn  = true
}

resource "google_storage_bucket" "static" {
  name     = "static-asset-bucket"
  location = "US"
}
```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=url_map_traffic_director_route&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Url Map Traffic Director Route


```hcl
resource "google_compute_url_map" "urlmap" {
  name        = "urlmap"
  description = "a description"
  default_service = google_compute_backend_service.home.id

  host_rule {
    hosts        = ["mysite.com"]
    path_matcher = "allpaths"
  }

  path_matcher {
    name = "allpaths"
    default_service = google_compute_backend_service.home.id

    route_rules {
      priority = 1
      header_action {
        request_headers_to_remove = ["RemoveMe2"]
        request_headers_to_add {
          header_name = "AddSomethingElse"
          header_value = "MyOtherValue"
          replace = true
        }
        response_headers_to_remove = ["RemoveMe3"]
        response_headers_to_add {
          header_name = "AddMe"
          header_value = "MyValue"
          replace = false
        }
      }
      match_rules {
        full_path_match = "a full path"
        header_matches {
          header_name = "someheader"
          exact_match = "match this exactly"
          invert_match = true
        }
        ignore_case = true
        metadata_filters {
          filter_match_criteria = "MATCH_ANY"
          filter_labels {
            name = "PLANET"
            value = "MARS"
          }
        }
        query_parameter_matches {
          name = "a query parameter"
          present_match = true
        }
      }
      url_redirect {
        host_redirect = "A host"
        https_redirect = false
        path_redirect = "some/path"
        redirect_response_code = "TEMPORARY_REDIRECT"
        strip_query = true
      }
    }
  }

  test {
    service = google_compute_backend_service.home.id
    host    = "hi.com"
    path    = "/home"
  }
}

resource "google_compute_backend_service" "home" {
  name        = "home"
  port_name   = "http"
  protocol    = "HTTP"
  timeout_sec = 10

  health_checks = [google_compute_health_check.default.id]
  load_balancing_scheme = "INTERNAL_SELF_MANAGED"
}

resource "google_compute_health_check" "default" {
  name               = "health-check"
  http_health_check {
    port = 80
  }
}
```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=url_map_traffic_director_route_partial&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Url Map Traffic Director Route Partial


```hcl
resource "google_compute_url_map" "urlmap" {
  name        = "urlmap"
  description = "a description"
  default_service = google_compute_backend_service.home.id

  host_rule {
    hosts        = ["mysite.com"]
    path_matcher = "allpaths"
  }

  path_matcher {
    name = "allpaths"
    default_service = google_compute_backend_service.home.id

    route_rules {
      priority = 1
      match_rules {
        prefix_match = "/someprefix"
        header_matches {
          header_name = "someheader"
          exact_match = "match this exactly"
          invert_match = true
        }
      }
      url_redirect {
        path_redirect = "some/path"
        redirect_response_code = "TEMPORARY_REDIRECT"
      }
    }
  }

  test {
    service = google_compute_backend_service.home.id
    host    = "hi.com"
    path    = "/home"
  }
}

resource "google_compute_backend_service" "home" {
  name        = "home"
  port_name   = "http"
  protocol    = "HTTP"
  timeout_sec = 10

  health_checks = [google_compute_health_check.default.id]
  load_balancing_scheme = "INTERNAL_SELF_MANAGED"
}

resource "google_compute_health_check" "default" {
  name               = "health-check"
  http_health_check {
    port = 80
  }
}
```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=url_map_traffic_director_path&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Url Map Traffic Director Path


```hcl
resource "google_compute_url_map" "urlmap" {
  name        = "urlmap"
  description = "a description"
  default_service = google_compute_backend_service.home.id

  host_rule {
    hosts        = ["mysite.com"]
    path_matcher = "allpaths"
  }

  path_matcher {
    name = "allpaths"
    default_service = google_compute_backend_service.home.id

    path_rule {
      paths   = ["/home"]
      route_action {
        cors_policy {
          allow_credentials = true
          allow_headers = ["Allowed content"]
          allow_methods = ["GET"]
          allow_origin_regexes = ["abc.*"]
          allow_origins = ["Allowed origin"]
          expose_headers = ["Exposed header"]
          max_age = 30
          disabled = false
        }
        fault_injection_policy {
          abort {
            http_status = 234
            percentage = 5.6
          }
          delay {
            fixed_delay {
              seconds = 0
              nanos = 50000
            }
            percentage = 7.8
          }
        }
        request_mirror_policy {
          backend_service = google_compute_backend_service.home.id
        }
        retry_policy {
          num_retries = 4
          per_try_timeout {
            seconds = 30
          }
          retry_conditions = ["5xx", "deadline-exceeded"]
        }
        timeout {
          seconds = 20
          nanos = 750000000
        }
        url_rewrite {
          host_rewrite = "dev.example.com"
          path_prefix_rewrite = "/v1/api/"
        }
        weighted_backend_services {
          backend_service = google_compute_backend_service.home.id
          weight = 400
          header_action {
            request_headers_to_remove = ["RemoveMe"]
            request_headers_to_add {
              header_name = "AddMe"
              header_value = "MyValue"
              replace = true
            }
            response_headers_to_remove = ["RemoveMe"]
            response_headers_to_add {
              header_name = "AddMe"
              header_value = "MyValue"
              replace = false
            }
          }
        }
      }
    }
  }

  test {
    service = google_compute_backend_service.home.id
    host    = "hi.com"
    path    = "/home"
  }
}

resource "google_compute_backend_service" "home" {
  name        = "home"
  port_name   = "http"
  protocol    = "HTTP"
  timeout_sec = 10

  health_checks = [google_compute_health_check.default.id]
  load_balancing_scheme = "INTERNAL_SELF_MANAGED"
}

resource "google_compute_health_check" "default" {
  name               = "health-check"
  http_health_check {
    port = 80
  }
}
```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=url_map_traffic_director_path_partial&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Url Map Traffic Director Path Partial


```hcl
resource "google_compute_url_map" "urlmap" {
  name        = "urlmap"
  description = "a description"
  default_service = google_compute_backend_service.home.id

  host_rule {
    hosts        = ["mysite.com"]
    path_matcher = "allpaths"
  }

  path_matcher {
    name = "allpaths"
    default_service = google_compute_backend_service.home.id

    path_rule {
      paths   = ["/home"]
      route_action {
        cors_policy {
          allow_credentials = true
          allow_headers = ["Allowed content"]
          allow_methods = ["GET"]
          allow_origin_regexes = ["abc.*"]
          allow_origins = ["Allowed origin"]
          expose_headers = ["Exposed header"]
          max_age = 30
          disabled = false
        }
        weighted_backend_services {
          backend_service = google_compute_backend_service.home.id
          weight = 400
          header_action {
            request_headers_to_remove = ["RemoveMe"]
            request_headers_to_add {
              header_name = "AddMe"
              header_value = "MyValue"
              replace = true
            }
            response_headers_to_remove = ["RemoveMe"]
            response_headers_to_add {
              header_name = "AddMe"
              header_value = "MyValue"
              replace = false
            }
          }
        }
      }
    }
  }

  test {
    service = google_compute_backend_service.home.id
    host    = "hi.com"
    path    = "/home"
  }
}

resource "google_compute_backend_service" "home" {
  name        = "home"
  port_name   = "http"
  protocol    = "HTTP"
  timeout_sec = 10

  health_checks = [google_compute_health_check.default.id]
  load_balancing_scheme = "INTERNAL_SELF_MANAGED"
}

resource "google_compute_health_check" "default" {
  name               = "health-check"
  http_health_check {
    port = 80
  }
}

```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=url_map_header_based_routing&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Url Map Header Based Routing


```hcl
resource "google_compute_url_map" "urlmap" {
  name        = "urlmap"
  description = "header-based routing example"
  default_service = google_compute_backend_service.default.id

  host_rule {
    hosts = ["*"]
    path_matcher = "allpaths"
  }

  path_matcher {
    name = "allpaths"
    default_service = google_compute_backend_service.default.id

    route_rules {
      priority = 1
      service = google_compute_backend_service.service-a.id
      match_rules {
        prefix_match = "/"
        ignore_case = true
        header_matches {
          header_name = "abtest"
          exact_match = "a"
        }
      }
    }
    route_rules {
      priority = 2
      service = google_compute_backend_service.service-b.id
      match_rules {
        ignore_case = true
        prefix_match = "/"
        header_matches {
          header_name = "abtest"
          exact_match = "b"
        }
      }
    }
  }
}

resource "google_compute_backend_service" "default" {
  name        = "default"
  port_name   = "http"
  protocol    = "HTTP"
  timeout_sec = 10

  health_checks = [google_compute_http_health_check.default.id]
}

resource "google_compute_backend_service" "service-a" {
  name        = "service-a"
  port_name   = "http"
  protocol    = "HTTP"
  timeout_sec = 10

  health_checks = [google_compute_http_health_check.default.id]
}

resource "google_compute_backend_service" "service-b" {
  name        = "service-b"
  port_name   = "http"
  protocol    = "HTTP"
  timeout_sec = 10

  health_checks = [google_compute_http_health_check.default.id]
}

resource "google_compute_http_health_check" "default" {
  name               = "health-check"
  request_path       = "/"
  check_interval_sec = 1
  timeout_sec        = 1
}
```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=url_map_parameter_based_routing&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Url Map Parameter Based Routing


```hcl
resource "google_compute_url_map" "urlmap" {
  name        = "urlmap"
  description = "parameter-based routing example"
  default_service = google_compute_backend_service.default.id

  host_rule {
    hosts = ["*"]
    path_matcher = "allpaths"
  }

  path_matcher {
    name = "allpaths"
    default_service = google_compute_backend_service.default.id

    route_rules {
      priority = 1
      service = google_compute_backend_service.service-a.id
      match_rules {
        prefix_match = "/"
        ignore_case = true
        query_parameter_matches {
          name = "abtest"
          exact_match = "a"
        }
      }
    }
    route_rules {
      priority = 2
      service = google_compute_backend_service.service-b.id
      match_rules {
        ignore_case = true
        prefix_match = "/"
        query_parameter_matches {
          name = "abtest"
          exact_match = "b"
        }
      }
    }
  }
}

resource "google_compute_backend_service" "default" {
  name        = "default"
  port_name   = "http"
  protocol    = "HTTP"
  timeout_sec = 10

  health_checks = [google_compute_http_health_check.default.id]
}

resource "google_compute_backend_service" "service-a" {
  name        = "service-a"
  port_name   = "http"
  protocol    = "HTTP"
  timeout_sec = 10

  health_checks = [google_compute_http_health_check.default.id]
}

resource "google_compute_backend_service" "service-b" {
  name        = "service-b"
  port_name   = "http"
  protocol    = "HTTP"
  timeout_sec = 10

  health_checks = [google_compute_http_health_check.default.id]
}

resource "google_compute_http_health_check" "default" {
  name               = "health-check"
  request_path       = "/"
  check_interval_sec = 1
  timeout_sec        = 1
}
```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=url_map_path_template_match&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Url Map Path Template Match


```hcl
resource "google_compute_url_map" "urlmap" {
  name        = "urlmap"
  description = "a description"

  default_service = google_compute_backend_bucket.static.id

  host_rule {
    hosts        = ["mysite.com"]
    path_matcher = "mysite"
  }

  path_matcher {
    name            = "mysite"
    default_service = google_compute_backend_bucket.static.id

    route_rules {
      match_rules {
        path_template_match = "/xyzwebservices/v2/xyz/users/{username=*}/carts/{cartid=**}"
      }
      service = google_compute_backend_service.cart-backend.id
      priority = 1
      route_action {
        url_rewrite {
          path_template_rewrite = "/{username}-{cartid}/"
        }
      }
    }

    route_rules {
      match_rules {
        path_template_match = "/xyzwebservices/v2/xyz/users/*/accountinfo/*"
      }
      service = google_compute_backend_service.user-backend.id
      priority = 2
    }
  }
}

resource "google_compute_backend_service" "cart-backend" {
  name        = "cart-service"
  port_name   = "http"
  protocol    = "HTTP"
  timeout_sec = 10
  load_balancing_scheme = "EXTERNAL_MANAGED"

  health_checks = [google_compute_http_health_check.default.id]
}

resource "google_compute_backend_service" "user-backend" {
  name        = "user-service"
  port_name   = "http"
  protocol    = "HTTP"
  timeout_sec = 10
  load_balancing_scheme = "EXTERNAL_MANAGED"

  health_checks = [google_compute_http_health_check.default.id]
}

resource "google_compute_http_health_check" "default" {
  name               = "health-check"
  request_path       = "/"
  check_interval_sec = 1
  timeout_sec        = 1
}

resource "google_compute_backend_bucket" "static" {
  name        = "static-asset-backend-bucket"
  bucket_name = google_storage_bucket.static.name
  enable_cdn  = true
}

resource "google_storage_bucket" "static" {
  name     = "static-asset-bucket"
  location = "US"
}
```

## Argument Reference

The following arguments are supported:


* `name` -
  (Required)
  Name of the resource. Provided by the client when the resource is created. The
  name must be 1-63 characters long, and comply with RFC1035. Specifically, the
  name must be 1-63 characters long and match the regular expression
  `[a-z]([-a-z0-9]*[a-z0-9])?` which means the first character must be a lowercase
  letter, and all following characters must be a dash, lowercase letter, or digit,
  except the last character, which cannot be a dash.


- - -


* `default_service` -
  (Optional)
  The backend service or backend bucket to use when none of the given rules match.

* `description` -
  (Optional)
  An optional description of this resource. Provide this property when you create
  the resource.

* `header_action` -
  (Optional)
  Specifies changes to request and response headers that need to take effect for
  the selected backendService. The headerAction specified here take effect after
  headerAction specified under pathMatcher.
  Structure is [documented below](#nested_header_action).

* `host_rule` -
  (Optional)
  The list of HostRules to use against the URL.
  Structure is [documented below](#nested_host_rule).

* `path_matcher` -
  (Optional)
  The list of named PathMatchers to use against the URL.
  Structure is [documented below](#nested_path_matcher).

* `test` -
  (Optional)
  The list of expected URL mapping tests. Request to update this UrlMap will
  succeed only if all of the test cases pass. You can specify a maximum of 100
  tests per UrlMap.
  Structure is [documented below](#nested_test).

* `default_url_redirect` -
  (Optional)
  When none of the specified hostRules match, the request is redirected to a URL specified
  by defaultUrlRedirect. If defaultUrlRedirect is specified, defaultService or
  defaultRouteAction must not be set.
  Structure is [documented below](#nested_default_url_redirect).

* `default_route_action` -
  (Optional)
  defaultRouteAction takes effect when none of the hostRules match. The load balancer performs advanced routing actions
  like URL rewrites, header transformations, etc. prior to forwarding the request to the selected backend.
  If defaultRouteAction specifies any weightedBackendServices, defaultService must not be set. Conversely if defaultService
  is set, defaultRouteAction cannot contain any weightedBackendServices.
  Only one of defaultRouteAction or defaultUrlRedirect must be set.
  Structure is [documented below](#nested_default_route_action).

* `project` - (Optional) The ID of the project in which the resource belongs.
    If it is not provided, the provider project is used.


<a name="nested_header_action"></a>The `header_action` block supports:

* `request_headers_to_add` -
  (Optional)
  Headers to add to a matching request prior to forwarding the request to the
  backendService.
  Structure is [documented below](#nested_request_headers_to_add).

* `request_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the request
  prior to forwarding the request to the backendService.

* `response_headers_to_add` -
  (Optional)
  Headers to add the response prior to sending the response back to the client.
  Structure is [documented below](#nested_response_headers_to_add).

* `response_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the response
  prior to sending the response back to the client.


<a name="nested_request_headers_to_add"></a>The `request_headers_to_add` block supports:

* `header_name` -
  (Required)
  The name of the header.

* `header_value` -
  (Required)
  The value of the header to add.

* `replace` -
  (Required)
  If false, headerValue is appended to any values that already exist for the
  header. If true, headerValue is set for the header, discarding any values that
  were set for that header.

<a name="nested_response_headers_to_add"></a>The `response_headers_to_add` block supports:

* `header_name` -
  (Required)
  The name of the header.

* `header_value` -
  (Required)
  The value of the header to add.

* `replace` -
  (Required)
  If false, headerValue is appended to any values that already exist for the
  header. If true, headerValue is set for the header, discarding any values that
  were set for that header.

<a name="nested_host_rule"></a>The `host_rule` block supports:

* `description` -
  (Optional)
  An optional description of this resource. Provide this property when you create
  the resource.

* `hosts` -
  (Required)
  The list of host patterns to match. They must be valid hostnames, except * will
  match any string of ([a-z0-9-.]*). In that case, * must be the first character
  and must be followed in the pattern by either - or ..

* `path_matcher` -
  (Required)
  The name of the PathMatcher to use to match the path portion of the URL if the
  hostRule matches the URL's host portion.

<a name="nested_path_matcher"></a>The `path_matcher` block supports:

* `default_service` -
  (Optional)
  The backend service or backend bucket to use when none of the given paths match.

* `description` -
  (Optional)
  An optional description of this resource. Provide this property when you create
  the resource.

* `header_action` -
  (Optional)
  Specifies changes to request and response headers that need to take effect for
  the selected backendService. HeaderAction specified here are applied after the
  matching HttpRouteRule HeaderAction and before the HeaderAction in the UrlMap
  Structure is [documented below](#nested_header_action).

* `name` -
  (Required)
  The name to which this PathMatcher is referred by the HostRule.

* `path_rule` -
  (Optional)
  The list of path rules. Use this list instead of routeRules when routing based
  on simple path matching is all that's required. The order by which path rules
  are specified does not matter. Matches are always done on the longest-path-first
  basis. For example: a pathRule with a path /a/b/c/* will match before /a/b/*
  irrespective of the order in which those paths appear in this list. Within a
  given pathMatcher, only one of pathRules or routeRules must be set.
  Structure is [documented below](#nested_path_rule).

* `route_rules` -
  (Optional)
  The list of ordered HTTP route rules. Use this list instead of pathRules when
  advanced route matching and routing actions are desired. The order of specifying
  routeRules matters: the first rule that matches will cause its specified routing
  action to take effect. Within a given pathMatcher, only one of pathRules or
  routeRules must be set. routeRules are not supported in UrlMaps intended for
  External load balancers.
  Structure is [documented below](#nested_route_rules).

* `default_url_redirect` -
  (Optional)
  When none of the specified hostRules match, the request is redirected to a URL specified
  by defaultUrlRedirect. If defaultUrlRedirect is specified, defaultService or
  defaultRouteAction must not be set.
  Structure is [documented below](#nested_default_url_redirect).

* `default_route_action` -
  (Optional)
  defaultRouteAction takes effect when none of the pathRules or routeRules match. The load balancer performs
  advanced routing actions like URL rewrites, header transformations, etc. prior to forwarding the request
  to the selected backend. If defaultRouteAction specifies any weightedBackendServices, defaultService must not be set.
  Conversely if defaultService is set, defaultRouteAction cannot contain any weightedBackendServices.
  Only one of defaultRouteAction or defaultUrlRedirect must be set.
  Structure is [documented below](#nested_default_route_action).


<a name="nested_header_action"></a>The `header_action` block supports:

* `request_headers_to_add` -
  (Optional)
  Headers to add to a matching request prior to forwarding the request to the
  backendService.
  Structure is [documented below](#nested_request_headers_to_add).

* `request_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the request
  prior to forwarding the request to the backendService.

* `response_headers_to_add` -
  (Optional)
  Headers to add the response prior to sending the response back to the client.
  Structure is [documented below](#nested_response_headers_to_add).

* `response_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the response
  prior to sending the response back to the client.


<a name="nested_request_headers_to_add"></a>The `request_headers_to_add` block supports:

* `header_name` -
  (Required)
  The name of the header.

* `header_value` -
  (Required)
  The value of the header to add.

* `replace` -
  (Required)
  If false, headerValue is appended to any values that already exist for the
  header. If true, headerValue is set for the header, discarding any values that
  were set for that header.

<a name="nested_response_headers_to_add"></a>The `response_headers_to_add` block supports:

* `header_name` -
  (Required)
  The name of the header.

* `header_value` -
  (Required)
  The value of the header to add.

* `replace` -
  (Required)
  If false, headerValue is appended to any values that already exist for the
  header. If true, headerValue is set for the header, discarding any values that
  were set for that header.

<a name="nested_path_rule"></a>The `path_rule` block supports:

* `service` -
  (Optional)
  The backend service or backend bucket to use if any of the given paths match.

* `paths` -
  (Required)
  The list of path patterns to match. Each must start with / and the only place a
  \* is allowed is at the end following a /. The string fed to the path matcher
  does not include any text after the first ? or #, and those chars are not
  allowed here.

* `route_action` -
  (Optional)
  In response to a matching path, the load balancer performs advanced routing
  actions like URL rewrites, header transformations, etc. prior to forwarding the
  request to the selected backend. If routeAction specifies any
  weightedBackendServices, service must not be set. Conversely if service is set,
  routeAction cannot contain any  weightedBackendServices. Only one of routeAction
  or urlRedirect must be set.
  Structure is [documented below](#nested_route_action).

* `url_redirect` -
  (Optional)
  When a path pattern is matched, the request is redirected to a URL specified
  by urlRedirect. If urlRedirect is specified, service or routeAction must not
  be set.
  Structure is [documented below](#nested_url_redirect).


<a name="nested_route_action"></a>The `route_action` block supports:

* `cors_policy` -
  (Optional)
  The specification for allowing client side cross-origin requests. Please see W3C
  Recommendation for Cross Origin Resource Sharing
  Structure is [documented below](#nested_cors_policy).

* `fault_injection_policy` -
  (Optional)
  The specification for fault injection introduced into traffic to test the
  resiliency of clients to backend service failure. As part of fault injection,
  when clients send requests to a backend service, delays can be introduced by
  Loadbalancer on a percentage of requests before sending those request to the
  backend service. Similarly requests from clients can be aborted by the
  Loadbalancer for a percentage of requests. timeout and retry_policy will be
  ignored by clients that are configured with a fault_injection_policy.
  Structure is [documented below](#nested_fault_injection_policy).

* `request_mirror_policy` -
  (Optional)
  Specifies the policy on how requests intended for the route's backends are
  shadowed to a separate mirrored backend service. Loadbalancer does not wait for
  responses from the shadow service. Prior to sending traffic to the shadow
  service, the host / authority header is suffixed with -shadow.
  Structure is [documented below](#nested_request_mirror_policy).

* `retry_policy` -
  (Optional)
  Specifies the retry policy associated with this route.
  Structure is [documented below](#nested_retry_policy).

* `timeout` -
  (Optional)
  Specifies the timeout for the selected route. Timeout is computed from the time
  the request is has been fully processed (i.e. end-of-stream) up until the
  response has been completely processed. Timeout includes all retries. If not
  specified, the default value is 15 seconds.
  Structure is [documented below](#nested_timeout).

* `url_rewrite` -
  (Optional)
  The spec to modify the URL of the request, prior to forwarding the request to
  the matched service
  Structure is [documented below](#nested_url_rewrite).

* `weighted_backend_services` -
  (Optional)
  A list of weighted backend services to send traffic to when a route match
  occurs. The weights determine the fraction of traffic that flows to their
  corresponding backend service. If all traffic needs to go to a single backend
  service, there must be one  weightedBackendService with weight set to a non 0
  number. Once a backendService is identified and before forwarding the request to
  the backend service, advanced routing actions like Url rewrites and header
  transformations are applied depending on additional settings specified in this
  HttpRouteAction.
  Structure is [documented below](#nested_weighted_backend_services).


<a name="nested_cors_policy"></a>The `cors_policy` block supports:

* `allow_credentials` -
  (Optional)
  In response to a preflight request, setting this to true indicates that the
  actual request can include user credentials. This translates to the Access-
  Control-Allow-Credentials header. Defaults to false.

* `allow_headers` -
  (Optional)
  Specifies the content for the Access-Control-Allow-Headers header.

* `allow_methods` -
  (Optional)
  Specifies the content for the Access-Control-Allow-Methods header.

* `allow_origin_regexes` -
  (Optional)
  Specifies the regular expression patterns that match allowed origins. For
  regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript
  An origin is allowed if it matches either allow_origins or allow_origin_regex.

* `allow_origins` -
  (Optional)
  Specifies the list of origins that will be allowed to do CORS requests. An
  origin is allowed if it matches either allow_origins or allow_origin_regex.

* `disabled` -
  (Required)
  If true, specifies the CORS policy is disabled.

* `expose_headers` -
  (Optional)
  Specifies the content for the Access-Control-Expose-Headers header.

* `max_age` -
  (Optional)
  Specifies how long the results of a preflight request can be cached. This
  translates to the content for the Access-Control-Max-Age header.

<a name="nested_fault_injection_policy"></a>The `fault_injection_policy` block supports:

* `abort` -
  (Optional)
  The specification for how client requests are aborted as part of fault
  injection.
  Structure is [documented below](#nested_abort).

* `delay` -
  (Optional)
  The specification for how client requests are delayed as part of fault
  injection, before being sent to a backend service.
  Structure is [documented below](#nested_delay).


<a name="nested_abort"></a>The `abort` block supports:

* `http_status` -
  (Required)
  The HTTP status code used to abort the request. The value must be between 200
  and 599 inclusive.

* `percentage` -
  (Required)
  The percentage of traffic (connections/operations/requests) which will be
  aborted as part of fault injection. The value must be between 0.0 and 100.0
  inclusive.

<a name="nested_delay"></a>The `delay` block supports:

* `fixed_delay` -
  (Required)
  Specifies the value of the fixed delay interval.
  Structure is [documented below](#nested_fixed_delay).

* `percentage` -
  (Required)
  The percentage of traffic (connections/operations/requests) on which delay will
  be introduced as part of fault injection. The value must be between 0.0 and
  100.0 inclusive.


<a name="nested_fixed_delay"></a>The `fixed_delay` block supports:

* `nanos` -
  (Optional)
  Span of time that's a fraction of a second at nanosecond resolution. Durations
  less than one second are represented with a 0 `seconds` field and a positive
  `nanos` field. Must be from 0 to 999,999,999 inclusive.

* `seconds` -
  (Required)
  Span of time at a resolution of a second. Must be from 0 to 315,576,000,000
  inclusive.

<a name="nested_request_mirror_policy"></a>The `request_mirror_policy` block supports:

* `backend_service` -
  (Required)
  The BackendService resource being mirrored to.

<a name="nested_retry_policy"></a>The `retry_policy` block supports:

* `num_retries` -
  (Optional)
  Specifies the allowed number retries. This number must be > 0.

* `per_try_timeout` -
  (Optional)
  Specifies a non-zero timeout per retry attempt.
  Structure is [documented below](#nested_per_try_timeout).

* `retry_conditions` -
  (Optional)
  Specifies one or more conditions when this retry rule applies. Valid values are:
  * 5xx: Loadbalancer will attempt a retry if the backend service responds with
  any 5xx response code, or if the backend service does not respond at all,
  example: disconnects, reset, read timeout, connection failure, and refused
  streams.
  * gateway-error: Similar to 5xx, but only applies to response codes
  502, 503 or 504.
  * connect-failure: Loadbalancer will retry on failures
  connecting to backend services, for example due to connection timeouts.
  * retriable-4xx: Loadbalancer will retry for retriable 4xx response codes.
  Currently the only retriable error supported is 409.
  * refused-stream: Loadbalancer will retry if the backend service resets the stream with a
  REFUSED_STREAM error code. This reset type indicates that it is safe to retry.
  * cancelled: Loadbalancer will retry if the gRPC status code in the response
  header is set to cancelled
  * deadline-exceeded: Loadbalancer will retry if the
  gRPC status code in the response header is set to deadline-exceeded
  * resource-exhausted: Loadbalancer will retry if the gRPC status code in the response
  header is set to resource-exhausted
  * unavailable: Loadbalancer will retry if
  the gRPC status code in the response header is set to unavailable


<a name="nested_per_try_timeout"></a>The `per_try_timeout` block supports:

* `nanos` -
  (Optional)
  Span of time that's a fraction of a second at nanosecond resolution. Durations
  less than one second are represented with a 0 `seconds` field and a positive
  `nanos` field. Must be from 0 to 999,999,999 inclusive.

* `seconds` -
  (Required)
  Span of time at a resolution of a second. Must be from 0 to 315,576,000,000
  inclusive.

<a name="nested_timeout"></a>The `timeout` block supports:

* `nanos` -
  (Optional)
  Span of time that's a fraction of a second at nanosecond resolution. Durations
  less than one second are represented with a 0 `seconds` field and a positive
  `nanos` field. Must be from 0 to 999,999,999 inclusive.

* `seconds` -
  (Required)
  Span of time at a resolution of a second. Must be from 0 to 315,576,000,000
  inclusive.

<a name="nested_url_rewrite"></a>The `url_rewrite` block supports:

* `host_rewrite` -
  (Optional)
  Prior to forwarding the request to the selected service, the request's host
  header is replaced with contents of hostRewrite. The value must be between 1 and
  255 characters.

* `path_prefix_rewrite` -
  (Optional)
  Prior to forwarding the request to the selected backend service, the matching
  portion of the request's path is replaced by pathPrefixRewrite. The value must
  be between 1 and 1024 characters.

<a name="nested_weighted_backend_services"></a>The `weighted_backend_services` block supports:

* `backend_service` -
  (Required)
  The default BackendService resource. Before
  forwarding the request to backendService, the loadbalancer applies any relevant
  headerActions specified as part of this backendServiceWeight.

* `header_action` -
  (Optional)
  Specifies changes to request and response headers that need to take effect for
  the selected backendService. headerAction specified here take effect before
  headerAction in the enclosing HttpRouteRule, PathMatcher and UrlMap.
  Structure is [documented below](#nested_header_action).

* `weight` -
  (Required)
  Specifies the fraction of traffic sent to backendService, computed as weight /
  (sum of all weightedBackendService weights in routeAction) . The selection of a
  backend service is determined only for new traffic. Once a user's request has
  been directed to a backendService, subsequent requests will be sent to the same
  backendService as determined by the BackendService's session affinity policy.
  The value must be between 0 and 1000


<a name="nested_header_action"></a>The `header_action` block supports:

* `request_headers_to_add` -
  (Optional)
  Headers to add to a matching request prior to forwarding the request to the
  backendService.
  Structure is [documented below](#nested_request_headers_to_add).

* `request_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the request
  prior to forwarding the request to the backendService.

* `response_headers_to_add` -
  (Optional)
  Headers to add the response prior to sending the response back to the client.
  Structure is [documented below](#nested_response_headers_to_add).

* `response_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the response
  prior to sending the response back to the client.


<a name="nested_request_headers_to_add"></a>The `request_headers_to_add` block supports:

* `header_name` -
  (Required)
  The name of the header.

* `header_value` -
  (Required)
  The value of the header to add.

* `replace` -
  (Required)
  If false, headerValue is appended to any values that already exist for the
  header. If true, headerValue is set for the header, discarding any values that
  were set for that header.

<a name="nested_response_headers_to_add"></a>The `response_headers_to_add` block supports:

* `header_name` -
  (Required)
  The name of the header.

* `header_value` -
  (Required)
  The value of the header to add.

* `replace` -
  (Required)
  If false, headerValue is appended to any values that already exist for the
  header. If true, headerValue is set for the header, discarding any values that
  were set for that header.

<a name="nested_url_redirect"></a>The `url_redirect` block supports:

* `host_redirect` -
  (Optional)
  The host that will be used in the redirect response instead of the one
  that was supplied in the request. The value must be between 1 and 255
  characters.

* `https_redirect` -
  (Optional)
  If set to true, the URL scheme in the redirected request is set to https.
  If set to false, the URL scheme of the redirected request will remain the
  same as that of the request. This must only be set for UrlMaps used in
  TargetHttpProxys. Setting this true for TargetHttpsProxy is not
  permitted. The default is set to false.

* `path_redirect` -
  (Optional)
  The path that will be used in the redirect response instead of the one
  that was supplied in the request. pathRedirect cannot be supplied
  together with prefixRedirect. Supply one alone or neither. If neither is
  supplied, the path of the original request will be used for the redirect.
  The value must be between 1 and 1024 characters.

* `prefix_redirect` -
  (Optional)
  The prefix that replaces the prefixMatch specified in the
  HttpRouteRuleMatch, retaining the remaining portion of the URL before
  redirecting the request. prefixRedirect cannot be supplied together with
  pathRedirect. Supply one alone or neither. If neither is supplied, the
  path of the original request will be used for the redirect. The value
  must be between 1 and 1024 characters.

* `redirect_response_code` -
  (Optional)
  The HTTP Status code to use for this RedirectAction. Supported values are:
  * MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301.
  * FOUND, which corresponds to 302.
  * SEE_OTHER which corresponds to 303.
  * TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method
  will be retained.
  * PERMANENT_REDIRECT, which corresponds to 308. In this case,
  the request method will be retained.

* `strip_query` -
  (Required)
  If set to true, any accompanying query portion of the original URL is
  removed prior to redirecting the request. If set to false, the query
  portion of the original URL is retained.
   This field is required to ensure an empty block is not set. The normal default value is false.

<a name="nested_route_rules"></a>The `route_rules` block supports:

* `priority` -
  (Required)
  For routeRules within a given pathMatcher, priority determines the order
  in which load balancer will interpret routeRules. RouteRules are evaluated
  in order of priority, from the lowest to highest number. The priority of
  a rule decreases as its number increases (1, 2, 3, N+1). The first rule
  that matches the request is applied.
  You cannot configure two or more routeRules with the same priority.
  Priority for each rule must be set to a number between 0 and
  2147483647 inclusive.
  Priority numbers can have gaps, which enable you to add or remove rules
  in the future without affecting the rest of the rules. For example,
  1, 2, 3, 4, 5, 9, 12, 16 is a valid series of priority numbers to which
  you could add rules numbered from 6 to 8, 10 to 11, and 13 to 15 in the
  future without any impact on existing rules.

* `service` -
  (Optional)
  The backend service resource to which traffic is
  directed if this rule is matched. If routeAction is additionally specified,
  advanced routing actions like URL Rewrites, etc. take effect prior to sending
  the request to the backend. However, if service is specified, routeAction cannot
  contain any weightedBackendService s. Conversely, if routeAction specifies any
  weightedBackendServices, service must not be specified. Only one of urlRedirect,
  service or routeAction.weightedBackendService must be set.

* `header_action` -
  (Optional)
  Specifies changes to request and response headers that need to take effect for
  the selected backendService. The headerAction specified here are applied before
  the matching pathMatchers[].headerAction and after pathMatchers[].routeRules[].r
  outeAction.weightedBackendService.backendServiceWeightAction[].headerAction
  Structure is [documented below](#nested_header_action).

* `match_rules` -
  (Optional)
  The rules for determining a match.
  Structure is [documented below](#nested_match_rules).

* `route_action` -
  (Optional)
  In response to a matching matchRule, the load balancer performs advanced routing
  actions like URL rewrites, header transformations, etc. prior to forwarding the
  request to the selected backend. If  routeAction specifies any
  weightedBackendServices, service must not be set. Conversely if service is set,
  routeAction cannot contain any  weightedBackendServices. Only one of routeAction
  or urlRedirect must be set.
  Structure is [documented below](#nested_route_action).

* `url_redirect` -
  (Optional)
  When this rule is matched, the request is redirected to a URL specified by
  urlRedirect. If urlRedirect is specified, service or routeAction must not be
  set.
  Structure is [documented below](#nested_url_redirect).


<a name="nested_header_action"></a>The `header_action` block supports:

* `request_headers_to_add` -
  (Optional)
  Headers to add to a matching request prior to forwarding the request to the
  backendService.
  Structure is [documented below](#nested_request_headers_to_add).

* `request_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the request
  prior to forwarding the request to the backendService.

* `response_headers_to_add` -
  (Optional)
  Headers to add the response prior to sending the response back to the client.
  Structure is [documented below](#nested_response_headers_to_add).

* `response_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the response
  prior to sending the response back to the client.


<a name="nested_request_headers_to_add"></a>The `request_headers_to_add` block supports:

* `header_name` -
  (Required)
  The name of the header.

* `header_value` -
  (Required)
  The value of the header to add.

* `replace` -
  (Required)
  If false, headerValue is appended to any values that already exist for the
  header. If true, headerValue is set for the header, discarding any values that
  were set for that header.

<a name="nested_response_headers_to_add"></a>The `response_headers_to_add` block supports:

* `header_name` -
  (Required)
  The name of the header.

* `header_value` -
  (Required)
  The value of the header to add.

* `replace` -
  (Required)
  If false, headerValue is appended to any values that already exist for the
  header. If true, headerValue is set for the header, discarding any values that
  were set for that header.

<a name="nested_match_rules"></a>The `match_rules` block supports:

* `full_path_match` -
  (Optional)
  For satisfying the matchRule condition, the path of the request must exactly
  match the value specified in fullPathMatch after removing any query parameters
  and anchor that may be part of the original URL. FullPathMatch must be between 1
  and 1024 characters. Only one of prefixMatch, fullPathMatch or regexMatch must
  be specified.

* `header_matches` -
  (Optional)
  Specifies a list of header match criteria, all of which must match corresponding
  headers in the request.
  Structure is [documented below](#nested_header_matches).

* `ignore_case` -
  (Optional)
  Specifies that prefixMatch and fullPathMatch matches are case sensitive.
  Defaults to false.

* `metadata_filters` -
  (Optional)
  Opaque filter criteria used by Loadbalancer to restrict routing configuration to
  a limited set xDS compliant clients. In their xDS requests to Loadbalancer, xDS
  clients present node metadata. If a match takes place, the relevant routing
  configuration is made available to those proxies. For each metadataFilter in
  this list, if its filterMatchCriteria is set to MATCH_ANY, at least one of the
  filterLabels must match the corresponding label provided in the metadata. If its
  filterMatchCriteria is set to MATCH_ALL, then all of its filterLabels must match
  with corresponding labels in the provided metadata. metadataFilters specified
  here can be overrides those specified in ForwardingRule that refers to this
  UrlMap. metadataFilters only applies to Loadbalancers that have their
  loadBalancingScheme set to INTERNAL_SELF_MANAGED.
  Structure is [documented below](#nested_metadata_filters).

* `prefix_match` -
  (Optional)
  For satisfying the matchRule condition, the request's path must begin with the
  specified prefixMatch. prefixMatch must begin with a /. The value must be
  between 1 and 1024 characters. Only one of prefixMatch, fullPathMatch or
  regexMatch must be specified.

* `query_parameter_matches` -
  (Optional)
  Specifies a list of query parameter match criteria, all of which must match
  corresponding query parameters in the request.
  Structure is [documented below](#nested_query_parameter_matches).

* `regex_match` -
  (Optional)
  For satisfying the matchRule condition, the path of the request must satisfy the
  regular expression specified in regexMatch after removing any query parameters
  and anchor supplied with the original URL. For regular expression grammar please
  see en.cppreference.com/w/cpp/regex/ecmascript  Only one of prefixMatch,
  fullPathMatch or regexMatch must be specified.

* `path_template_match` -
  (Optional)
  For satisfying the matchRule condition, the path of the request
  must match the wildcard pattern specified in pathTemplateMatch
  after removing any query parameters and anchor that may be part
  of the original URL.
  pathTemplateMatch must be between 1 and 255 characters
  (inclusive).  The pattern specified by pathTemplateMatch may
  have at most 5 wildcard operators and at most 5 variable
  captures in total.


<a name="nested_header_matches"></a>The `header_matches` block supports:

* `exact_match` -
  (Optional)
  The value should exactly match contents of exactMatch. Only one of exactMatch,
  prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.

* `header_name` -
  (Required)
  The name of the HTTP header to match. For matching against the HTTP request's
  authority, use a headerMatch with the header name ":authority". For matching a
  request's method, use the headerName ":method".

* `invert_match` -
  (Optional)
  If set to false, the headerMatch is considered a match if the match criteria
  above are met. If set to true, the headerMatch is considered a match if the
  match criteria above are NOT met. Defaults to false.

* `prefix_match` -
  (Optional)
  The value of the header must start with the contents of prefixMatch. Only one of
  exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch
  must be set.

* `present_match` -
  (Optional)
  A header with the contents of headerName must exist. The match takes place
  whether or not the request's header has a value or not. Only one of exactMatch,
  prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set.

* `range_match` -
  (Optional)
  The header value must be an integer and its value must be in the range specified
  in rangeMatch. If the header does not contain an integer, number or is empty,
  the match fails. For example for a range [-5, 0]   - -3 will match.  - 0 will
  not match.  - 0.25 will not match.  - -3someString will not match.   Only one of
  exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch
  must be set.
  Structure is [documented below](#nested_range_match).

* `regex_match` -
  (Optional)
  The value of the header must match the regular expression specified in
  regexMatch. For regular expression grammar, please see:
  en.cppreference.com/w/cpp/regex/ecmascript  For matching against a port
  specified in the HTTP request, use a headerMatch with headerName set to PORT and
  a regular expression that satisfies the RFC2616 Host header's port specifier.
  Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or
  rangeMatch must be set.

* `suffix_match` -
  (Optional)
  The value of the header must end with the contents of suffixMatch. Only one of
  exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch
  must be set.


<a name="nested_range_match"></a>The `range_match` block supports:

* `range_end` -
  (Required)
  The end of the range (exclusive).

* `range_start` -
  (Required)
  The start of the range (inclusive).

<a name="nested_metadata_filters"></a>The `metadata_filters` block supports:

* `filter_labels` -
  (Required)
  The list of label value pairs that must match labels in the provided metadata
  based on filterMatchCriteria  This list must not be empty and can have at the
  most 64 entries.
  Structure is [documented below](#nested_filter_labels).

* `filter_match_criteria` -
  (Required)
  Specifies how individual filterLabel matches within the list of filterLabels
  contribute towards the overall metadataFilter match. Supported values are:
    - MATCH_ANY: At least one of the filterLabels must have a matching label in the
  provided metadata.
    - MATCH_ALL: All filterLabels must have matching labels in
  the provided metadata.
  Possible values are: `MATCH_ALL`, `MATCH_ANY`.


<a name="nested_filter_labels"></a>The `filter_labels` block supports:

* `name` -
  (Required)
  Name of metadata label. The name can have a maximum length of 1024 characters
  and must be at least 1 character long.

* `value` -
  (Required)
  The value of the label must match the specified value. value can have a maximum
  length of 1024 characters.

<a name="nested_query_parameter_matches"></a>The `query_parameter_matches` block supports:

* `exact_match` -
  (Optional)
  The queryParameterMatch matches if the value of the parameter exactly matches
  the contents of exactMatch. Only one of presentMatch, exactMatch and regexMatch
  must be set.

* `name` -
  (Required)
  The name of the query parameter to match. The query parameter must exist in the
  request, in the absence of which the request match fails.

* `present_match` -
  (Optional)
  Specifies that the queryParameterMatch matches if the request contains the query
  parameter, irrespective of whether the parameter has a value or not. Only one of
  presentMatch, exactMatch and regexMatch must be set.

* `regex_match` -
  (Optional)
  The queryParameterMatch matches if the value of the parameter matches the
  regular expression specified by regexMatch. For the regular expression grammar,
  please see en.cppreference.com/w/cpp/regex/ecmascript  Only one of presentMatch,
  exactMatch and regexMatch must be set.

<a name="nested_route_action"></a>The `route_action` block supports:

* `cors_policy` -
  (Optional)
  The specification for allowing client side cross-origin requests. Please see W3C
  Recommendation for Cross Origin Resource Sharing
  Structure is [documented below](#nested_cors_policy).

* `fault_injection_policy` -
  (Optional)
  The specification for fault injection introduced into traffic to test the
  resiliency of clients to backend service failure. As part of fault injection,
  when clients send requests to a backend service, delays can be introduced by
  Loadbalancer on a percentage of requests before sending those request to the
  backend service. Similarly requests from clients can be aborted by the
  Loadbalancer for a percentage of requests. timeout and retry_policy will be
  ignored by clients that are configured with a fault_injection_policy.
  Structure is [documented below](#nested_fault_injection_policy).

* `request_mirror_policy` -
  (Optional)
  Specifies the policy on how requests intended for the route's backends are
  shadowed to a separate mirrored backend service. Loadbalancer does not wait for
  responses from the shadow service. Prior to sending traffic to the shadow
  service, the host / authority header is suffixed with -shadow.
  Structure is [documented below](#nested_request_mirror_policy).

* `retry_policy` -
  (Optional)
  Specifies the retry policy associated with this route.
  Structure is [documented below](#nested_retry_policy).

* `timeout` -
  (Optional)
  Specifies the timeout for the selected route. Timeout is computed from the time
  the request is has been fully processed (i.e. end-of-stream) up until the
  response has been completely processed. Timeout includes all retries. If not
  specified, the default value is 15 seconds.
  Structure is [documented below](#nested_timeout).

* `url_rewrite` -
  (Optional)
  The spec to modify the URL of the request, prior to forwarding the request to
  the matched service
  Structure is [documented below](#nested_url_rewrite).

* `weighted_backend_services` -
  (Optional)
  A list of weighted backend services to send traffic to when a route match
  occurs. The weights determine the fraction of traffic that flows to their
  corresponding backend service. If all traffic needs to go to a single backend
  service, there must be one  weightedBackendService with weight set to a non 0
  number. Once a backendService is identified and before forwarding the request to
  the backend service, advanced routing actions like Url rewrites and header
  transformations are applied depending on additional settings specified in this
  HttpRouteAction.
  Structure is [documented below](#nested_weighted_backend_services).


<a name="nested_cors_policy"></a>The `cors_policy` block supports:

* `allow_credentials` -
  (Optional)
  In response to a preflight request, setting this to true indicates that the
  actual request can include user credentials. This translates to the Access-
  Control-Allow-Credentials header. Defaults to false.

* `allow_headers` -
  (Optional)
  Specifies the content for the Access-Control-Allow-Headers header.

* `allow_methods` -
  (Optional)
  Specifies the content for the Access-Control-Allow-Methods header.

* `allow_origin_regexes` -
  (Optional)
  Specifies the regular expression patterns that match allowed origins. For
  regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript
  An origin is allowed if it matches either allow_origins or allow_origin_regex.

* `allow_origins` -
  (Optional)
  Specifies the list of origins that will be allowed to do CORS requests. An
  origin is allowed if it matches either allow_origins or allow_origin_regex.

* `disabled` -
  (Optional)
  If true, specifies the CORS policy is disabled.
  which indicates that the CORS policy is in effect. Defaults to false.

* `expose_headers` -
  (Optional)
  Specifies the content for the Access-Control-Expose-Headers header.

* `max_age` -
  (Optional)
  Specifies how long the results of a preflight request can be cached. This
  translates to the content for the Access-Control-Max-Age header.

<a name="nested_fault_injection_policy"></a>The `fault_injection_policy` block supports:

* `abort` -
  (Optional)
  The specification for how client requests are aborted as part of fault
  injection.
  Structure is [documented below](#nested_abort).

* `delay` -
  (Optional)
  The specification for how client requests are delayed as part of fault
  injection, before being sent to a backend service.
  Structure is [documented below](#nested_delay).


<a name="nested_abort"></a>The `abort` block supports:

* `http_status` -
  (Optional)
  The HTTP status code used to abort the request. The value must be between 200
  and 599 inclusive.

* `percentage` -
  (Optional)
  The percentage of traffic (connections/operations/requests) which will be
  aborted as part of fault injection. The value must be between 0.0 and 100.0
  inclusive.

<a name="nested_delay"></a>The `delay` block supports:

* `fixed_delay` -
  (Optional)
  Specifies the value of the fixed delay interval.
  Structure is [documented below](#nested_fixed_delay).

* `percentage` -
  (Optional)
  The percentage of traffic (connections/operations/requests) on which delay will
  be introduced as part of fault injection. The value must be between 0.0 and
  100.0 inclusive.


<a name="nested_fixed_delay"></a>The `fixed_delay` block supports:

* `nanos` -
  (Optional)
  Span of time that's a fraction of a second at nanosecond resolution. Durations
  less than one second are represented with a 0 `seconds` field and a positive
  `nanos` field. Must be from 0 to 999,999,999 inclusive.

* `seconds` -
  (Required)
  Span of time at a resolution of a second. Must be from 0 to 315,576,000,000
  inclusive.

<a name="nested_request_mirror_policy"></a>The `request_mirror_policy` block supports:

* `backend_service` -
  (Required)
  The BackendService resource being mirrored to.

<a name="nested_retry_policy"></a>The `retry_policy` block supports:

* `num_retries` -
  (Required)
  Specifies the allowed number retries. This number must be > 0.

* `per_try_timeout` -
  (Optional)
  Specifies a non-zero timeout per retry attempt.
  If not specified, will use the timeout set in HttpRouteAction. If timeout in HttpRouteAction
  is not set, will use the largest timeout among all backend services associated with the route.
  Structure is [documented below](#nested_per_try_timeout).

* `retry_conditions` -
  (Optional)
  Specfies one or more conditions when this retry rule applies. Valid values are:
  * 5xx: Loadbalancer will attempt a retry if the backend service responds with
    any 5xx response code, or if the backend service does not respond at all,
    example: disconnects, reset, read timeout, connection failure, and refused
    streams.
  * gateway-error: Similar to 5xx, but only applies to response codes
    502, 503 or 504.
  * connect-failure: Loadbalancer will retry on failures
    connecting to backend services, for example due to connection timeouts.
  * retriable-4xx: Loadbalancer will retry for retriable 4xx response codes.
    Currently the only retriable error supported is 409.
  * refused-stream: Loadbalancer will retry if the backend service resets the stream with a
    REFUSED_STREAM error code. This reset type indicates that it is safe to retry.
  * cancelled: Loadbalancer will retry if the gRPC status code in the response
    header is set to cancelled
  * deadline-exceeded: Loadbalancer will retry if the
    gRPC status code in the response header is set to deadline-exceeded
  * resource-exhausted: Loadbalancer will retry if the gRPC status code in the response
    header is set to resource-exhausted
  * unavailable: Loadbalancer will retry if the gRPC status code in
    the response header is set to unavailable


<a name="nested_per_try_timeout"></a>The `per_try_timeout` block supports:

* `nanos` -
  (Optional)
  Span of time that's a fraction of a second at nanosecond resolution. Durations
  less than one second are represented with a 0 `seconds` field and a positive
  `nanos` field. Must be from 0 to 999,999,999 inclusive.

* `seconds` -
  (Required)
  Span of time at a resolution of a second. Must be from 0 to 315,576,000,000
  inclusive.

<a name="nested_timeout"></a>The `timeout` block supports:

* `nanos` -
  (Optional)
  Span of time that's a fraction of a second at nanosecond resolution. Durations
  less than one second are represented with a 0 `seconds` field and a positive
  `nanos` field. Must be from 0 to 999,999,999 inclusive.

* `seconds` -
  (Required)
  Span of time at a resolution of a second. Must be from 0 to 315,576,000,000
  inclusive.

<a name="nested_url_rewrite"></a>The `url_rewrite` block supports:

* `host_rewrite` -
  (Optional)
  Prior to forwarding the request to the selected service, the request's host
  header is replaced with contents of hostRewrite. The value must be between 1 and
  255 characters.

* `path_prefix_rewrite` -
  (Optional)
  Prior to forwarding the request to the selected backend service, the matching
  portion of the request's path is replaced by pathPrefixRewrite. The value must
  be between 1 and 1024 characters.

* `path_template_rewrite` -
  (Optional)
  Prior to forwarding the request to the selected origin, if the
  request matched a pathTemplateMatch, the matching portion of the
  request's path is replaced re-written using the pattern specified
  by pathTemplateRewrite.
  pathTemplateRewrite must be between 1 and 255 characters
  (inclusive), must start with a '/', and must only use variables
  captured by the route's pathTemplate matchers.
  pathTemplateRewrite may only be used when all of a route's
  MatchRules specify pathTemplate.
  Only one of pathPrefixRewrite and pathTemplateRewrite may be
  specified.

<a name="nested_weighted_backend_services"></a>The `weighted_backend_services` block supports:

* `backend_service` -
  (Required)
  The default BackendService resource. Before
  forwarding the request to backendService, the loadbalancer applies any relevant
  headerActions specified as part of this backendServiceWeight.

* `header_action` -
  (Optional)
  Specifies changes to request and response headers that need to take effect for
  the selected backendService. headerAction specified here take effect before
  headerAction in the enclosing HttpRouteRule, PathMatcher and UrlMap.
  Structure is [documented below](#nested_header_action).

* `weight` -
  (Required)
  Specifies the fraction of traffic sent to backendService, computed as weight /
  (sum of all weightedBackendService weights in routeAction) . The selection of a
  backend service is determined only for new traffic. Once a user's request has
  been directed to a backendService, subsequent requests will be sent to the same
  backendService as determined by the BackendService's session affinity policy.
  The value must be between 0 and 1000


<a name="nested_header_action"></a>The `header_action` block supports:

* `request_headers_to_add` -
  (Optional)
  Headers to add to a matching request prior to forwarding the request to the
  backendService.
  Structure is [documented below](#nested_request_headers_to_add).

* `request_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the request
  prior to forwarding the request to the backendService.

* `response_headers_to_add` -
  (Optional)
  Headers to add the response prior to sending the response back to the client.
  Structure is [documented below](#nested_response_headers_to_add).

* `response_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the response
  prior to sending the response back to the client.


<a name="nested_request_headers_to_add"></a>The `request_headers_to_add` block supports:

* `header_name` -
  (Required)
  The name of the header.

* `header_value` -
  (Required)
  The value of the header to add.

* `replace` -
  (Required)
  If false, headerValue is appended to any values that already exist for the
  header. If true, headerValue is set for the header, discarding any values that
  were set for that header.

<a name="nested_response_headers_to_add"></a>The `response_headers_to_add` block supports:

* `header_name` -
  (Required)
  The name of the header.

* `header_value` -
  (Required)
  The value of the header to add.

* `replace` -
  (Required)
  If false, headerValue is appended to any values that already exist for the
  header. If true, headerValue is set for the header, discarding any values that
  were set for that header.

<a name="nested_url_redirect"></a>The `url_redirect` block supports:

* `host_redirect` -
  (Optional)
  The host that will be used in the redirect response instead of the one that was
  supplied in the request. The value must be between 1 and 255 characters.

* `https_redirect` -
  (Optional)
  If set to true, the URL scheme in the redirected request is set to https. If set
  to false, the URL scheme of the redirected request will remain the same as that
  of the request. This must only be set for UrlMaps used in TargetHttpProxys.
  Setting this true for TargetHttpsProxy is not permitted. Defaults to false.

* `path_redirect` -
  (Optional)
  The path that will be used in the redirect response instead of the one that was
  supplied in the request. Only one of pathRedirect or prefixRedirect must be
  specified. The value must be between 1 and 1024 characters.

* `prefix_redirect` -
  (Optional)
  The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch,
  retaining the remaining portion of the URL before redirecting the request.

* `redirect_response_code` -
  (Optional)
  The HTTP Status code to use for this RedirectAction. Supported values are:
  * MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301.
  * FOUND, which corresponds to 302.
  * SEE_OTHER which corresponds to 303.
  * TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method will be retained.
  * PERMANENT_REDIRECT, which corresponds to 308. In this case, the request method will be retained.

* `strip_query` -
  (Optional)
  If set to true, any accompanying query portion of the original URL is removed
  prior to redirecting the request. If set to false, the query portion of the
  original URL is retained. Defaults to false.

<a name="nested_default_url_redirect"></a>The `default_url_redirect` block supports:

* `host_redirect` -
  (Optional)
  The host that will be used in the redirect response instead of the one that was
  supplied in the request. The value must be between 1 and 255 characters.

* `https_redirect` -
  (Optional)
  If set to true, the URL scheme in the redirected request is set to https. If set to
  false, the URL scheme of the redirected request will remain the same as that of the
  request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this
  true for TargetHttpsProxy is not permitted. The default is set to false.

* `path_redirect` -
  (Optional)
  The path that will be used in the redirect response instead of the one that was
  supplied in the request. pathRedirect cannot be supplied together with
  prefixRedirect. Supply one alone or neither. If neither is supplied, the path of the
  original request will be used for the redirect. The value must be between 1 and 1024
  characters.

* `prefix_redirect` -
  (Optional)
  The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch,
  retaining the remaining portion of the URL before redirecting the request.
  prefixRedirect cannot be supplied together with pathRedirect. Supply one alone or
  neither. If neither is supplied, the path of the original request will be used for
  the redirect. The value must be between 1 and 1024 characters.

* `redirect_response_code` -
  (Optional)
  The HTTP Status code to use for this RedirectAction. Supported values are:
  * MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301.
  * FOUND, which corresponds to 302.
  * SEE_OTHER which corresponds to 303.
  * TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method
  will be retained.
  * PERMANENT_REDIRECT, which corresponds to 308. In this case,
  the request method will be retained.

* `strip_query` -
  (Required)
  If set to true, any accompanying query portion of the original URL is removed prior
  to redirecting the request. If set to false, the query portion of the original URL is
  retained.
   This field is required to ensure an empty block is not set. The normal default value is false.

<a name="nested_default_route_action"></a>The `default_route_action` block supports:

* `weighted_backend_services` -
  (Optional)
  A list of weighted backend services to send traffic to when a route match occurs.
  The weights determine the fraction of traffic that flows to their corresponding backend service.
  If all traffic needs to go to a single backend service, there must be one weightedBackendService
  with weight set to a non 0 number.
  Once a backendService is identified and before forwarding the request to the backend service,
  advanced routing actions like Url rewrites and header transformations are applied depending on
  additional settings specified in this HttpRouteAction.
  Structure is [documented below](#nested_weighted_backend_services).

* `url_rewrite` -
  (Optional)
  The spec to modify the URL of the request, prior to forwarding the request to the matched service.
  Structure is [documented below](#nested_url_rewrite).

* `timeout` -
  (Optional)
  Specifies the timeout for the selected route. Timeout is computed from the time the request has been
  fully processed (i.e. end-of-stream) up until the response has been completely processed. Timeout includes all retries.
  If not specified, will use the largest timeout among all backend services associated with the route.
  Structure is [documented below](#nested_timeout).

* `retry_policy` -
  (Optional)
  Specifies the retry policy associated with this route.
  Structure is [documented below](#nested_retry_policy).

* `request_mirror_policy` -
  (Optional)
  Specifies the policy on how requests intended for the route's backends are shadowed to a separate mirrored backend service.
  Loadbalancer does not wait for responses from the shadow service. Prior to sending traffic to the shadow service,
  the host / authority header is suffixed with -shadow.
  Structure is [documented below](#nested_request_mirror_policy).

* `cors_policy` -
  (Optional)
  The specification for allowing client side cross-origin requests. Please see
  [W3C Recommendation for Cross Origin Resource Sharing](https://www.w3.org/TR/cors/)
  Structure is [documented below](#nested_cors_policy).

* `fault_injection_policy` -
  (Optional)
  The specification for fault injection introduced into traffic to test the resiliency of clients to backend service failure.
  As part of fault injection, when clients send requests to a backend service, delays can be introduced by Loadbalancer on a
  percentage of requests before sending those request to the backend service. Similarly requests from clients can be aborted
  by the Loadbalancer for a percentage of requests.
  timeout and retryPolicy will be ignored by clients that are configured with a faultInjectionPolicy.
  Structure is [documented below](#nested_fault_injection_policy).


<a name="nested_weighted_backend_services"></a>The `weighted_backend_services` block supports:

* `backend_service` -
  (Optional)
  The full or partial URL to the default BackendService resource. Before forwarding the
  request to backendService, the loadbalancer applies any relevant headerActions
  specified as part of this backendServiceWeight.

* `weight` -
  (Optional)
  Specifies the fraction of traffic sent to backendService, computed as
  weight / (sum of all weightedBackendService weights in routeAction) .
  The selection of a backend service is determined only for new traffic. Once a user's request
  has been directed to a backendService, subsequent requests will be sent to the same backendService
  as determined by the BackendService's session affinity policy.
  The value must be between 0 and 1000

* `header_action` -
  (Optional)
  Specifies changes to request and response headers that need to take effect for
  the selected backendService.
  headerAction specified here take effect before headerAction in the enclosing
  HttpRouteRule, PathMatcher and UrlMap.
  Structure is [documented below](#nested_header_action).


<a name="nested_header_action"></a>The `header_action` block supports:

* `request_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the request prior to
  forwarding the request to the backendService.

* `request_headers_to_add` -
  (Optional)
  Headers to add to a matching request prior to forwarding the request to the backendService.
  Structure is [documented below](#nested_request_headers_to_add).

* `response_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the response prior to sending the
  response back to the client.

* `response_headers_to_add` -
  (Optional)
  Headers to add the response prior to sending the response back to the client.
  Structure is [documented below](#nested_response_headers_to_add).


<a name="nested_request_headers_to_add"></a>The `request_headers_to_add` block supports:

* `header_name` -
  (Optional)
  The name of the header to add.

* `header_value` -
  (Optional)
  The value of the header to add.

* `replace` -
  (Optional)
  If false, headerValue is appended to any values that already exist for the header.
  If true, headerValue is set for the header, discarding any values that were set for that header.

<a name="nested_response_headers_to_add"></a>The `response_headers_to_add` block supports:

* `header_name` -
  (Optional)
  The name of the header to add.

* `header_value` -
  (Optional)
  The value of the header to add.

* `replace` -
  (Optional)
  If false, headerValue is appended to any values that already exist for the header.
  If true, headerValue is set for the header, discarding any values that were set for that header.

<a name="nested_url_rewrite"></a>The `url_rewrite` block supports:

* `path_prefix_rewrite` -
  (Optional)
  Prior to forwarding the request to the selected backend service, the matching portion of the
  request's path is replaced by pathPrefixRewrite.
  The value must be between 1 and 1024 characters.

* `host_rewrite` -
  (Optional)
  Prior to forwarding the request to the selected service, the request's host header is replaced
  with contents of hostRewrite.
  The value must be between 1 and 255 characters.

<a name="nested_timeout"></a>The `timeout` block supports:

* `seconds` -
  (Optional)
  Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
  Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years

* `nanos` -
  (Optional)
  Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented
  with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.

<a name="nested_retry_policy"></a>The `retry_policy` block supports:

* `retry_conditions` -
  (Optional)
  Specfies one or more conditions when this retry rule applies. Valid values are:
  * 5xx: Loadbalancer will attempt a retry if the backend service responds with any 5xx response code,
    or if the backend service does not respond at all, example: disconnects, reset, read timeout,
  * connection failure, and refused streams.
  * gateway-error: Similar to 5xx, but only applies to response codes 502, 503 or 504.
  * connect-failure: Loadbalancer will retry on failures connecting to backend services,
    for example due to connection timeouts.
  * retriable-4xx: Loadbalancer will retry for retriable 4xx response codes.
    Currently the only retriable error supported is 409.
  * refused-stream:Loadbalancer will retry if the backend service resets the stream with a REFUSED_STREAM error code.
    This reset type indicates that it is safe to retry.
  * cancelled: Loadbalancer will retry if the gRPC status code in the response header is set to cancelled
  * deadline-exceeded: Loadbalancer will retry if the gRPC status code in the response header is set to deadline-exceeded
  * resource-exhausted: Loadbalancer will retry if the gRPC status code in the response header is set to resource-exhausted
  * unavailable: Loadbalancer will retry if the gRPC status code in the response header is set to unavailable

* `num_retries` -
  (Optional)
  Specifies the allowed number retries. This number must be > 0. If not specified, defaults to 1.

* `per_try_timeout` -
  (Optional)
  Specifies a non-zero timeout per retry attempt.
  If not specified, will use the timeout set in HttpRouteAction. If timeout in HttpRouteAction is not set,
  will use the largest timeout among all backend services associated with the route.
  Structure is [documented below](#nested_per_try_timeout).


<a name="nested_per_try_timeout"></a>The `per_try_timeout` block supports:

* `seconds` -
  (Optional)
  Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
  Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years

* `nanos` -
  (Optional)
  Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are
  represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.

<a name="nested_request_mirror_policy"></a>The `request_mirror_policy` block supports:

* `backend_service` -
  (Required)
  The full or partial URL to the BackendService resource being mirrored to.

<a name="nested_cors_policy"></a>The `cors_policy` block supports:

* `allow_origins` -
  (Optional)
  Specifies the list of origins that will be allowed to do CORS requests.
  An origin is allowed if it matches either an item in allowOrigins or an item in allowOriginRegexes.

* `allow_origin_regexes` -
  (Optional)
  Specifies the regular expression patterns that match allowed origins. For regular expression grammar
  please see en.cppreference.com/w/cpp/regex/ecmascript
  An origin is allowed if it matches either an item in allowOrigins or an item in allowOriginRegexes.

* `allow_methods` -
  (Optional)
  Specifies the content for the Access-Control-Allow-Methods header.

* `allow_headers` -
  (Optional)
  Specifies the content for the Access-Control-Allow-Headers header.

* `expose_headers` -
  (Optional)
  Specifies the content for the Access-Control-Expose-Headers header.

* `max_age` -
  (Optional)
  Specifies how long results of a preflight request can be cached in seconds.
  This translates to the Access-Control-Max-Age header.

* `allow_credentials` -
  (Optional)
  In response to a preflight request, setting this to true indicates that the actual request can include user credentials.
  This translates to the Access-Control-Allow-Credentials header.

* `disabled` -
  (Optional)
  If true, specifies the CORS policy is disabled. The default value is false, which indicates that the CORS policy is in effect.

<a name="nested_fault_injection_policy"></a>The `fault_injection_policy` block supports:

* `delay` -
  (Optional)
  The specification for how client requests are delayed as part of fault injection, before being sent to a backend service.
  Structure is [documented below](#nested_delay).

* `abort` -
  (Optional)
  The specification for how client requests are aborted as part of fault injection.
  Structure is [documented below](#nested_abort).


<a name="nested_delay"></a>The `delay` block supports:

* `fixed_delay` -
  (Optional)
  Specifies the value of the fixed delay interval.
  Structure is [documented below](#nested_fixed_delay).

* `percentage` -
  (Optional)
  The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection.
  The value must be between 0.0 and 100.0 inclusive.


<a name="nested_fixed_delay"></a>The `fixed_delay` block supports:

* `seconds` -
  (Optional)
  Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
  Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years

* `nanos` -
  (Optional)
  Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are
  represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.

<a name="nested_abort"></a>The `abort` block supports:

* `http_status` -
  (Optional)
  The HTTP status code used to abort the request.
  The value must be between 200 and 599 inclusive.

* `percentage` -
  (Optional)
  The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection.
  The value must be between 0.0 and 100.0 inclusive.

<a name="nested_test"></a>The `test` block supports:

* `description` -
  (Optional)
  Description of this test case.

* `host` -
  (Required)
  Host portion of the URL.

* `path` -
  (Required)
  Path portion of the URL.

* `service` -
  (Required)
  The backend service or backend bucket link that should be matched by this test.

<a name="nested_default_url_redirect"></a>The `default_url_redirect` block supports:

* `host_redirect` -
  (Optional)
  The host that will be used in the redirect response instead of the one that was
  supplied in the request. The value must be between 1 and 255 characters.

* `https_redirect` -
  (Optional)
  If set to true, the URL scheme in the redirected request is set to https. If set to
  false, the URL scheme of the redirected request will remain the same as that of the
  request. This must only be set for UrlMaps used in TargetHttpProxys. Setting this
  true for TargetHttpsProxy is not permitted. The default is set to false.

* `path_redirect` -
  (Optional)
  The path that will be used in the redirect response instead of the one that was
  supplied in the request. pathRedirect cannot be supplied together with
  prefixRedirect. Supply one alone or neither. If neither is supplied, the path of the
  original request will be used for the redirect. The value must be between 1 and 1024
  characters.

* `prefix_redirect` -
  (Optional)
  The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch,
  retaining the remaining portion of the URL before redirecting the request.
  prefixRedirect cannot be supplied together with pathRedirect. Supply one alone or
  neither. If neither is supplied, the path of the original request will be used for
  the redirect. The value must be between 1 and 1024 characters.

* `redirect_response_code` -
  (Optional)
  The HTTP Status code to use for this RedirectAction. Supported values are:
  * MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301.
  * FOUND, which corresponds to 302.
  * SEE_OTHER which corresponds to 303.
  * TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method
  will be retained.
  * PERMANENT_REDIRECT, which corresponds to 308. In this case,
  the request method will be retained.

* `strip_query` -
  (Required)
  If set to true, any accompanying query portion of the original URL is removed prior
  to redirecting the request. If set to false, the query portion of the original URL is
  retained. The default is set to false.
   This field is required to ensure an empty block is not set. The normal default value is false.

<a name="nested_default_route_action"></a>The `default_route_action` block supports:

* `weighted_backend_services` -
  (Optional)
  A list of weighted backend services to send traffic to when a route match occurs.
  The weights determine the fraction of traffic that flows to their corresponding backend service.
  If all traffic needs to go to a single backend service, there must be one weightedBackendService
  with weight set to a non 0 number.
  Once a backendService is identified and before forwarding the request to the backend service,
  advanced routing actions like Url rewrites and header transformations are applied depending on
  additional settings specified in this HttpRouteAction.
  Structure is [documented below](#nested_weighted_backend_services).

* `url_rewrite` -
  (Optional)
  The spec to modify the URL of the request, prior to forwarding the request to the matched service.
  Structure is [documented below](#nested_url_rewrite).

* `timeout` -
  (Optional)
  Specifies the timeout for the selected route. Timeout is computed from the time the request has been
  fully processed (i.e. end-of-stream) up until the response has been completely processed. Timeout includes all retries.
  If not specified, will use the largest timeout among all backend services associated with the route.
  Structure is [documented below](#nested_timeout).

* `retry_policy` -
  (Optional)
  Specifies the retry policy associated with this route.
  Structure is [documented below](#nested_retry_policy).

* `request_mirror_policy` -
  (Optional)
  Specifies the policy on how requests intended for the route's backends are shadowed to a separate mirrored backend service.
  Loadbalancer does not wait for responses from the shadow service. Prior to sending traffic to the shadow service,
  the host / authority header is suffixed with -shadow.
  Structure is [documented below](#nested_request_mirror_policy).

* `cors_policy` -
  (Optional)
  The specification for allowing client side cross-origin requests. Please see
  [W3C Recommendation for Cross Origin Resource Sharing](https://www.w3.org/TR/cors/)
  Structure is [documented below](#nested_cors_policy).

* `fault_injection_policy` -
  (Optional)
  The specification for fault injection introduced into traffic to test the resiliency of clients to backend service failure.
  As part of fault injection, when clients send requests to a backend service, delays can be introduced by Loadbalancer on a
  percentage of requests before sending those request to the backend service. Similarly requests from clients can be aborted
  by the Loadbalancer for a percentage of requests.
  timeout and retryPolicy will be ignored by clients that are configured with a faultInjectionPolicy.
  Structure is [documented below](#nested_fault_injection_policy).


<a name="nested_weighted_backend_services"></a>The `weighted_backend_services` block supports:

* `backend_service` -
  (Optional)
  The full or partial URL to the default BackendService resource. Before forwarding the
  request to backendService, the loadbalancer applies any relevant headerActions
  specified as part of this backendServiceWeight.

* `weight` -
  (Optional)
  Specifies the fraction of traffic sent to backendService, computed as
  weight / (sum of all weightedBackendService weights in routeAction) .
  The selection of a backend service is determined only for new traffic. Once a user's request
  has been directed to a backendService, subsequent requests will be sent to the same backendService
  as determined by the BackendService's session affinity policy.
  The value must be between 0 and 1000

* `header_action` -
  (Optional)
  Specifies changes to request and response headers that need to take effect for
  the selected backendService.
  headerAction specified here take effect before headerAction in the enclosing
  HttpRouteRule, PathMatcher and UrlMap.
  Structure is [documented below](#nested_header_action).


<a name="nested_header_action"></a>The `header_action` block supports:

* `request_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the request prior to
  forwarding the request to the backendService.

* `request_headers_to_add` -
  (Optional)
  Headers to add to a matching request prior to forwarding the request to the backendService.
  Structure is [documented below](#nested_request_headers_to_add).

* `response_headers_to_remove` -
  (Optional)
  A list of header names for headers that need to be removed from the response prior to sending the
  response back to the client.

* `response_headers_to_add` -
  (Optional)
  Headers to add the response prior to sending the response back to the client.
  Structure is [documented below](#nested_response_headers_to_add).


<a name="nested_request_headers_to_add"></a>The `request_headers_to_add` block supports:

* `header_name` -
  (Optional)
  The name of the header to add.

* `header_value` -
  (Optional)
  The value of the header to add.

* `replace` -
  (Optional)
  If false, headerValue is appended to any values that already exist for the header.
  If true, headerValue is set for the header, discarding any values that were set for that header.

<a name="nested_response_headers_to_add"></a>The `response_headers_to_add` block supports:

* `header_name` -
  (Optional)
  The name of the header to add.

* `header_value` -
  (Optional)
  The value of the header to add.

* `replace` -
  (Optional)
  If false, headerValue is appended to any values that already exist for the header.
  If true, headerValue is set for the header, discarding any values that were set for that header.

<a name="nested_url_rewrite"></a>The `url_rewrite` block supports:

* `path_prefix_rewrite` -
  (Optional)
  Prior to forwarding the request to the selected backend service, the matching portion of the
  request's path is replaced by pathPrefixRewrite.
  The value must be between 1 and 1024 characters.

* `host_rewrite` -
  (Optional)
  Prior to forwarding the request to the selected service, the request's host header is replaced
  with contents of hostRewrite.
  The value must be between 1 and 255 characters.

<a name="nested_timeout"></a>The `timeout` block supports:

* `seconds` -
  (Optional)
  Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
  Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years

* `nanos` -
  (Optional)
  Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are represented
  with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.

<a name="nested_retry_policy"></a>The `retry_policy` block supports:

* `retry_conditions` -
  (Optional)
  Specfies one or more conditions when this retry rule applies. Valid values are:
  * 5xx: Loadbalancer will attempt a retry if the backend service responds with any 5xx response code,
    or if the backend service does not respond at all, example: disconnects, reset, read timeout,
  * connection failure, and refused streams.
  * gateway-error: Similar to 5xx, but only applies to response codes 502, 503 or 504.
  * connect-failure: Loadbalancer will retry on failures connecting to backend services,
    for example due to connection timeouts.
  * retriable-4xx: Loadbalancer will retry for retriable 4xx response codes.
    Currently the only retriable error supported is 409.
  * refused-stream:Loadbalancer will retry if the backend service resets the stream with a REFUSED_STREAM error code.
    This reset type indicates that it is safe to retry.
  * cancelled: Loadbalancer will retry if the gRPC status code in the response header is set to cancelled
  * deadline-exceeded: Loadbalancer will retry if the gRPC status code in the response header is set to deadline-exceeded
  * resource-exhausted: Loadbalancer will retry if the gRPC status code in the response header is set to resource-exhausted
  * unavailable: Loadbalancer will retry if the gRPC status code in the response header is set to unavailable

* `num_retries` -
  (Optional)
  Specifies the allowed number retries. This number must be > 0. If not specified, defaults to 1.

* `per_try_timeout` -
  (Optional)
  Specifies a non-zero timeout per retry attempt.
  If not specified, will use the timeout set in HttpRouteAction. If timeout in HttpRouteAction is not set,
  will use the largest timeout among all backend services associated with the route.
  Structure is [documented below](#nested_per_try_timeout).


<a name="nested_per_try_timeout"></a>The `per_try_timeout` block supports:

* `seconds` -
  (Optional)
  Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
  Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years

* `nanos` -
  (Optional)
  Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are
  represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.

<a name="nested_request_mirror_policy"></a>The `request_mirror_policy` block supports:

* `backend_service` -
  (Required)
  The full or partial URL to the BackendService resource being mirrored to.

<a name="nested_cors_policy"></a>The `cors_policy` block supports:

* `allow_origins` -
  (Optional)
  Specifies the list of origins that will be allowed to do CORS requests.
  An origin is allowed if it matches either an item in allowOrigins or an item in allowOriginRegexes.

* `allow_origin_regexes` -
  (Optional)
  Specifies the regular expression patterns that match allowed origins. For regular expression grammar
  please see en.cppreference.com/w/cpp/regex/ecmascript
  An origin is allowed if it matches either an item in allowOrigins or an item in allowOriginRegexes.

* `allow_methods` -
  (Optional)
  Specifies the content for the Access-Control-Allow-Methods header.

* `allow_headers` -
  (Optional)
  Specifies the content for the Access-Control-Allow-Headers header.

* `expose_headers` -
  (Optional)
  Specifies the content for the Access-Control-Expose-Headers header.

* `max_age` -
  (Optional)
  Specifies how long results of a preflight request can be cached in seconds.
  This translates to the Access-Control-Max-Age header.

* `allow_credentials` -
  (Optional)
  In response to a preflight request, setting this to true indicates that the actual request can include user credentials.
  This translates to the Access-Control-Allow-Credentials header.

* `disabled` -
  (Optional)
  If true, specifies the CORS policy is disabled. The default value is false, which indicates that the CORS policy is in effect.

<a name="nested_fault_injection_policy"></a>The `fault_injection_policy` block supports:

* `delay` -
  (Optional)
  The specification for how client requests are delayed as part of fault injection, before being sent to a backend service.
  Structure is [documented below](#nested_delay).

* `abort` -
  (Optional)
  The specification for how client requests are aborted as part of fault injection.
  Structure is [documented below](#nested_abort).


<a name="nested_delay"></a>The `delay` block supports:

* `fixed_delay` -
  (Optional)
  Specifies the value of the fixed delay interval.
  Structure is [documented below](#nested_fixed_delay).

* `percentage` -
  (Optional)
  The percentage of traffic (connections/operations/requests) on which delay will be introduced as part of fault injection.
  The value must be between 0.0 and 100.0 inclusive.


<a name="nested_fixed_delay"></a>The `fixed_delay` block supports:

* `seconds` -
  (Optional)
  Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive.
  Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years

* `nanos` -
  (Optional)
  Span of time that's a fraction of a second at nanosecond resolution. Durations less than one second are
  represented with a 0 seconds field and a positive nanos field. Must be from 0 to 999,999,999 inclusive.

<a name="nested_abort"></a>The `abort` block supports:

* `http_status` -
  (Optional)
  The HTTP status code used to abort the request.
  The value must be between 200 and 599 inclusive.

* `percentage` -
  (Optional)
  The percentage of traffic (connections/operations/requests) which will be aborted as part of fault injection.
  The value must be between 0.0 and 100.0 inclusive.

## Attributes Reference

In addition to the arguments listed above, the following computed attributes are exported:

* `id` - an identifier for the resource with format `projects/{{project}}/global/urlMaps/{{name}}`

* `creation_timestamp` -
  Creation timestamp in RFC3339 text format.

* `map_id` -
  The unique identifier for the resource.

* `fingerprint` -
  Fingerprint of this resource. A hash of the contents stored in this object. This
  field is used in optimistic locking.
* `self_link` - The URI of the created resource.


## Timeouts

This resource provides the following
[Timeouts](https://developer.hashicorp.com/terraform/plugin/sdkv2/resources/retries-and-customizable-timeouts) configuration options:

- `create` - Default is 20 minutes.
- `update` - Default is 20 minutes.
- `delete` - Default is 20 minutes.

## Import


UrlMap can be imported using any of these accepted formats:

* `projects/{{project}}/global/urlMaps/{{name}}`
* `{{project}}/{{name}}`
* `{{name}}`


In Terraform v1.5.0 and later, use an [`import` block](https://developer.hashicorp.com/terraform/language/import) to import UrlMap using one of the formats above. For example:

```tf
import {
  id = "projects/{{project}}/global/urlMaps/{{name}}"
  to = google_compute_url_map.default
}
```

When using the [`terraform import` command](https://developer.hashicorp.com/terraform/cli/commands/import), UrlMap can be imported using one of the formats above. For example:

```
$ terraform import google_compute_url_map.default projects/{{project}}/global/urlMaps/{{name}}
$ terraform import google_compute_url_map.default {{project}}/{{name}}
$ terraform import google_compute_url_map.default {{name}}
```

## User Project Overrides

This resource supports [User Project Overrides](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference#user_project_override).
