Benutzerdefinierte Fehlerantworten konfigurieren

Dieses Dokument enthält Beispielkonfigurationen von benutzerdefinierten Fehlerantworten. Bevor Sie eine benutzerdefinierte Fehlerantwort konfigurieren, lesen Sie die Übersicht über benutzerdefinierte Fehlerantworten.

Mit den auf dieser Seite beschriebenen Beispielkonfigurationen wird eine benutzerdefinierte Fehlerantwortrichtlinie auf drei Ebenen der URL-Zuordnungsressource konfiguriert: der Ebene des Load-Balancers, der URL-Domainebene und der URL-Pfadebene.

Die Beispielkonfigurationen basieren auf Konzepten und bauen auf Konfigurationen auf, die in den folgenden Dokumenten beschrieben werden:

Beispiel 1: Fehlerseite für alle 4xx-Fehler konfigurieren, die alle Hosts betreffen.

In diesem Beispiel wird davon ausgegangen, dass Sie einen Load Balancer eingerichtet haben, wie unter Globalen externen Application Load Balancer mit VM-Instanzgruppen-Back-Ends einrichten beschrieben.

In diesem Beispiel werden Anfragen an den Load-Balancer an den Backend-Dienst mit dem Namen web-backend-service weitergeleitet. Wenn die Anfrage auf eine 4xx-Antwort stößt, wird die benutzerdefinierte Fehlerantwortrichtlinie so konfiguriert, dass die Anfrage an den Fehlerdienst gesendet und ein Fehlerobjekt (not-found.html) an den Client zurückgegeben wird.

So erstellen Sie eine benutzerdefinierte Fehlerantwortrichtlinie:

  1. Laden Sie die HTML-Fehlerseite (not-found.html) in den Cloud Storage-Bucket hoch.

    gcloud storage cp Desktop/not-found.html gs://GCS_BUCKET_NAME/
    
  2. Exportieren Sie die URL-Zuordnung (web-map-http) in eine Datei mit dem Namen web-map-http.yaml.

    gcloud compute url-maps export web-map-http --destination web-map-http.yaml
    

    Bevor Sie die benutzerdefinierte Fehlerantwortrichtlinie hinzufügen, hat die URL-Zuordnung (web-map-http) eine Konfiguration ähnlich der folgenden.

    creationTimestamp: '2020-01-14T19:12:44.680-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/web-backend-service
    fingerprint: d0eJJpCBpHg=
    kind: compute#urlMap
    name: web-map-http
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    
  3. Bearbeiten Sie web-map-http.yaml, um eine benutzerdefinierte Richtlinie für Fehlerantworten hinzuzufügen, wie in der folgenden YAML-Konfiguration im Abschnitt defaultCustomErrorResponsePolicy hervorgehoben. In diesem Beispiel wird eine Fehlerantwortrichtlinie auf Ebene des Load Balancers (urlMaps.defaultCustomErrorResponsePolicy) konfiguriert.

    creationTimestamp: '2020-01-14T19:12:44.680-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/web-backend-service
    defaultCustomErrorResponsePolicy:
      errorResponseRules:
        - matchResponseCodes:
          - 4xx
          path: '/not-found.html'
      errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/CUSTOM_ERRORS_BUCKET
    fingerprint: d0eJJpCBpHg=
    kind: compute#urlMap
    name: web-map-http
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    

    Wir empfehlen, alle Fehlerobjekte in einem Cloud Storage-Bucket zu speichern und über einen Backend-Bucket auf sie zu verweisen, der an Ihrem Load Balancer angehängt ist. Cloud Storage-Buckets bieten eine einfache Möglichkeit, Fehlerobjekte zu speichern und über den Load-Balancer an Ihre Clients zurückzugeben. Sie können jedoch auch Fehlerseiten und zugehörige Assets bereitstellen, ohne einen Back-End-Bucket zu verwenden. Sie können beispielsweise einen Back-End-Dienst verwenden, der auf ein VM-Instanzgruppen-Back-End mit einem Apache-Server verweist, der für die Bereitstellung einer benutzerdefinierten Fehlerantwortseite konfiguriert ist.

  4. Aktualisieren Sie die URL-Zuordnung. Importieren Sie dazu die neueste Konfiguration aus web-map-http.yaml.

    gcloud compute url-maps import web-map-http --source web-map-http.yaml
    
  5. Nachdem Sie die URL-Zuordnung aktualisiert haben, müssen Sie einige Zeit warten, bevor Sie Traffic an die IP-Adresse des Load-Balancers senden können.

    Senden Sie eine Anfrage für eine Seite, die nicht existiert.

    curl -I http://IP_ADDRESS/a-page-that-does-not-exist
    

    Der Fehlerinhalt von not-found.html wird bereitgestellt und der HTTP-Statuscode 404 wird zurückgegeben.

Beispiel 2: Fehlerseite für einen bestimmten Fehlercode eines bestimmten Hosts konfigurieren

Dieses Beispiel baut auf dem vorherigen Beispiel auf: Fehlerseite für alle 4xx-Fehler konfigurieren, die allen Hosts gemeinsam sind. Es wird davon ausgegangen, dass ein Load-Balancer bereits so konfiguriert ist, dass Anfragen an den Host video.example.com an den Backend-Dienst mit dem Namen video-backend-service weitergeleitet werden. Wenn die Autorisierung einer Anfrage durch den Back-End-Dienst fehlschlägt, gibt der Dienst eine 401 (Unauthorized)-Antwort zurück. Die benutzerdefinierte Fehlerantwortrichtlinie ist so konfiguriert, dass die Anfrage an den Fehlerdienst gesendet und ein Fehlerobjekt (video-obtain-authorization.html) an den Client zurückgegeben wird.

In den meisten Fällen enthält Ihr Fehlerinhalt wahrscheinlich Links zu Assets, z. B. ein Logobild. Der Client stellt Anfragen für Assets, auf die auf der Fehlerseite verwiesen wird. An den Load-Balancer werden zusätzliche Anfragen gesendet, um diese abzurufen. Der Load-Balancer antwortet dann auf die Anfrage und gibt die verknüpften Assets zurück. Dazu werden diese Assets im selben Back-End-Bucket gespeichert, der in defaultCustomErrorResponsePolicy angegeben ist, und eine Regel zum Weiterleiten von Anfragen von Asset-URLs (z. B. /assets/logo.svg) an den Back-End-Bucket hinzugefügt. Die Antwort des Load-Balancers auf die Anfrage für verknüpfte Assets ist keine Fehlerantwort, sondern eine normale Antwort, wie in der folgenden Konfiguration dargestellt.

pathMatchers:
...
  pathRules:
  - service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/CUSTOM_ERRORS_BUCKET
    paths:
    - /assets

Mit der Richtlinie können Sie auch festlegen, wie der endgültige Antwortcode für die Anfrage aussehen soll. In diesem Beispiel wurde der Antwortcode von 401 in 200 geändert, indem der Wert von overrideResponseCode in 200 angegeben wurde. Bei allen anderen 4xx-Fehlern wird der Fehlerinhalt in not-found.html an den Client zurückgegeben und der ursprüngliche HTTP-Antwortcode des Backend-Dienstes bleibt erhalten.

Wie in der folgenden Tabelle dargestellt, werden in diesem Beispiel zwei benutzerdefinierte Fehlerantwortrichtlinien konfiguriert. Diese Richtlinien werden auf der Ebene des Load-Balancers und der URL-Domain erstellt.

Richtlinienebene API-Feld Übereinstimmung mit HTTP-Antwortcode Fehlerdienst Fehlerobjekt zurückgegeben
URL-Domain pathMatchers[].defaultCustomErrorResponsePolicy 401 CUSTOM_ERRORS_BUCKET video-obtain-authorization.html
Load-Balancer urlMaps.defaultCustomErrorResponsePolicy Alle 4xx CUSTOM_ERRORS_BUCKET not-found.html

So erstellen Sie eine benutzerdefinierte Fehlerantwortrichtlinie für den 401-Fehlercode für den Host video.example.com:

  1. Laden Sie die HTML-Fehlerseite (video-obtain-authorization.html) und zugehörige Assets (logo.svg) in den Cloud Storage-Bucket hoch.

    gcloud storage cp Desktop/video-obtain-authorization.html gs://GCS_BUCKET_NAME/
    gcloud storage cp Desktop/logo.svg gs://GCS_BUCKET_NAME/assets/
    
  2. Exportieren Sie die URL-Zuordnung (web-map-http) in eine Datei mit dem Namen web-map-http.yaml.

    gcloud compute url-maps export web-map-http --destination web-map-http.yaml
    
  3. Bearbeiten Sie web-map-http.yaml, um eine benutzerdefinierte Richtlinie für Fehlerantworten hinzuzufügen, wie in der folgenden YAML-Konfiguration im Abschnitt defaultCustomErrorResponsePolicy hervorgehoben. In diesem Beispiel wird eine benutzerdefinierte Fehlerantwortrichtlinie auf der Load Balancer-Ebene (urlMaps.defaultCustomErrorResponsePolicy) und der URL-Domainebene (pathMatchers[].defaultCustomErrorResponsePolicy) konfiguriert.

    Da der Fehlerdienst nicht auf URL-Domainebene definiert ist, verwendet der Fehlerdienst auf URL-Domainebene standardmäßig den auf höherer Ebene definierten Fehlerdienst, also auf der Ebene des Load-Balancers.

    creationTimestamp: '2020-01-14T19:12:44.680-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/web-backend-service
    defaultCustomErrorResponsePolicy:
      errorResponseRules:
        - matchResponseCodes:
          - 4xx
          path: '/not-found.html'
      errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/CUSTOM_ERRORS_BUCKET
    fingerprint: d0eJJpCBpHg=
    hostRules:
    - hosts:
      - video.example.com
      pathMatcher: path-matcher-1
    kind: compute#urlMap
    name: web-map-http
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-backend-service
      name: path-matcher-1
      defaultCustomErrorResponsePolicy:
        errorResponseRules:
          - matchResponseCodes:
            - 401
            path: "/video-obtain-authorization.html
            overrideResponseCode: 200
        // The `errorService` in `pathMatchers[].defaultCustomErrorResponsePolicy` references the
        // error service configured in `urlMaps.defaultCustomErrorResponsePolicy`.
    
      // A URL map path rule to route requests from asset URLs (for example, "/assets/logo.svg") to the backend bucket.
      pathRules:
      - service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/CUSTOM_ERRORS_BUCKET
        paths:
        - /assets
    
  4. Aktualisieren Sie die URL-Zuordnung. Importieren Sie dazu die neueste Konfiguration aus web-map-http.yaml.

    gcloud compute url-maps import web-map-http --source web-map-http.yaml
    
  5. Nachdem Sie die URL-Zuordnung aktualisiert haben, müssen Sie einige Zeit warten, bevor Sie Traffic an die IP-Adresse des Load-Balancers senden können.

    Senden Sie eine Anfrage an Ihren Host, um eine URL zu autorisieren, die autorisiert werden muss.

    curl -I http://video.example.com/a-page-that-needs-authorization
    

    Der Fehlerinhalt von video-obtain-authorization.html wird bereitgestellt und der HTTP-Statuscode 200 wird zurückgegeben.

Beispiel 3: Detaillierte benutzerdefinierte Richtlinien für Fehlerantworten für verschiedene Domains, Pfade und Fehlerantwortcodes konfigurieren

Dieses Beispiel zeigt, wie Sie bestimmte Fehlerantworten für verschiedene URL-Domains, URL-Pfade und HTTP-Fehlerantwortcodes anpassen können.

Bei der Konfiguration der benutzerdefinierten Fehlerantwort, die in diesem Beispiel erläutert wird, wird Folgendes vorausgesetzt:

  • Sie haben eine URL-Zuordnung für einen externen Application Load Balancer mit einem host- und pfadbasierten Routing konfiguriert, wie in der folgenden Abbildung dargestellt.

    Beispiel für die Einrichtung eines Backend-Dienstes
    Beispiel für die Einrichtung eines Back-End-Dienstes (zum Vergrößern anklicken)
  • Sie haben zwei Back-End-Buckets mit den Namen BUCKET_1 und BUCKET_2 konfiguriert, um die benutzerdefinierten Fehlerseiten zurückzugeben.

Wie in der folgenden Tabelle dargestellt, sind in diesem Beispiel vier benutzerdefinierte Fehlerantwortrichtlinien konfiguriert. Diese Richtlinien werden über drei Ebenen in der folgenden Rangfolge erstellt:

  1. URL-Pfad (pathMatchers[].pathRules[].customErrorResponsePolicy)
  2. URL-Domain (pathMatchers[].defaultCustomErrorResponsePolicy)
  3. Load Balancer (urlMaps.defaultCustomErrorResponsePolicy)
Richtlinienebene URL beantragen Übereinstimmung mit HTTP-Antwortcode Fehlerdienst Fehlerobjekt zurückgegeben
URL-Pfad example.net/video/hd/* 404 BUCKET-2 not-found-hd-videos-404.html
URL-Pfad example.net/video/sd/* 404 BUCKET-2 not-found-sd-videos-404.html
URL-Domain example.net/* Alle 4xx BUCKET-1 example-net-4xx.html
Load-Balancer Any Alle 4xx oder 5xx BUCKET-1 error-page-generic.html

Die benutzerdefinierte Fehlerantwortrichtlinie auf der Ebene des Load-Balancers wird nur angewendet, wenn die Richtlinie den Fehlerbedingungen entspricht und für den Fehlercode auf niedrigeren Ebenen, also der URL-Domain oder dem URL-Pfad, keine entsprechende Richtlinie definiert wurde. Ebenso wird die benutzerdefinierte Fehlerantwortrichtlinie auf der Ebene der URL-Domain nur angewendet, wenn die Richtlinie den Fehlerbedingungen entspricht und für den Fehlercode auf einer niedrigeren Ebene, also dem URL-Pfad, keine übereinstimmende Richtlinie definiert wurde. Wenn in diesem Beispiel eine Anfrage an die URL www.example.net/video/hd auf eine 404-Antwort stößt, wird die Datei not-found-hd-videos-404.html zurückgegeben. Wenn jedoch eine 404-Antwort für eine Anfrage an die URL www.example.net/video/ festgestellt wird, wir die Datei example-net-4xx.html zurückgegeben.

So erstellen Sie benutzerdefinierte Fehlerantwortrichtlinien auf drei Ebenen der URL-Zuordnung:

  1. Fehlerobjekte in die Cloud Storage-Buckets hochladen

    gcloud storage cp Desktop/error-page-generic.html gs://GCS_BUCKET_1_NAME/
    gcloud storage cp Desktop/example-net-4xx.html gs://GCS_BUCKET_1_NAME/
    gcloud storage cp Desktop/not-found-sd-videos-404.html gs://GCS_BUCKET_2_NAME/
    gcloud storage cp Desktop/not-found-hd-videos-404.html gs://GCS_BUCKET_2_NAME/
    
  2. Exportieren Sie die URL-Zuordnung (video-org-url-map) in eine Datei mit dem Namen video-org-url-map.yaml..

    gcloud compute url-maps export video-org-url-map --destination video-org-url-map.yaml
    

    Bevor Sie die benutzerdefinierte Fehlerantwortrichtlinie hinzufügen, hat die URL-Zuordnung (video-org-url-map) eine Konfiguration, die der folgenden ähnelt.

    creationTimestamp: '2021-03-05T13:34:15.833-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/org-site
    fingerprint: mfyJIT7Zurs=
    hostRules:
    - hosts:
      - '*'
      pathMatcher: video-matcher
    - hosts:
      - example.net
      pathMatcher: video-matcher
    id: '8886405179645041976'
    kind: compute#urlMap
    name: video-org-url-map
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-site
      name: video-matcher
      pathRules:
      - paths:
        - /video/hd
        - /video/hd/*
        service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-hd
      - paths:
        - /video/sd
        - /video/sd/*
        service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-sd
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/video-org-url-map
    
  3. Bearbeiten Sie video-org-url-map.yaml, um benutzerdefinierte Richtlinien für Fehlerantworten hinzuzufügen, wie im Abschnitt defaultCustomErrorResponsePolicy der folgenden YAML-Konfiguration hervorgehoben.

    Da der Fehlerdienst nicht auf URL-Domainebene definiert ist, verwendet der Fehlerdienst auf URL-Domainebene standardmäßig den auf höherer Ebene definierten Fehlerdienst, also auf der Ebene des Load-Balancers.

    creationTimestamp: '2021-03-05T13:34:15.833-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/org-site
    fingerprint: mfyJIT7Zurs=
    hostRules:
    - hosts:
      - '*'
      pathMatcher: video-matcher
    - hosts:
      - example.net
      pathMatcher: video-matcher
    id: '8886405179645041976'
    kind: compute#urlMap
    name: video-org-url-map
    defaultCustomErrorResponsePolicy:
      errorResponseRules:
        - matchResponseCodes:
          - 4xx
          - 5xx
          path: '/error-page-generic.html'
      errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BUCKET-1
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-site
      name: video-matcher
      defaultCustomErrorResponsePolicy:
          errorResponseRules:
            - matchResponseCodes:
              - 4xx
              path: '/example-net-4xx.html'
          // The `errorService` in `pathMatchers[].defaultCustomErrorResponsePolicy` references the
          // error service configured in `urlMaps.defaultCustomErrorResponsePolicy`.
      pathRules:
      - paths:
        - /video/hd
        - /video/hd/*
        service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-hd
        customErrorResponsePolicy:
              errorResponseRules:
                - matchResponseCodes:
                  - 404
                  path: '/not-found-hd-videos-404.html'
              errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BUCKET-2
      - paths:
        - /video/sd
        - /video/sd/*
        service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-sd
        customErrorResponsePolicy:
              errorResponseRules:
                - matchResponseCodes:
                  - 404
                  path: '/not-found-sd-videos-404.html'
              errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BUCKET-2
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/video-org-url-map
    
  4. Aktualisieren Sie die URL-Zuordnung. Importieren Sie dazu die neueste Konfiguration aus video-org-url-map.yaml.

    gcloud compute url-maps import video-org-url-map --source video-org-url-map.yaml
    
  5. Nachdem Sie die URL-Zuordnung aktualisiert haben, müssen Sie einige Zeit warten, bevor Sie Traffic an die IP-Adresse des Load-Balancers senden können.

    Senden Sie eine Anfrage für eine Seite, die nicht existiert.

    curl -I http://example.net/a-page-that-does-not-exist
    

    Der Fehlerinhalt von example-net-4xx.html wird bereitgestellt.

    Ebenso sollten Sie nach anderen URLs mit unterschiedlichen URL-Domains und URL-Pfaden suchen.