{"id":11493,"date":"2023-11-30T20:00:00","date_gmt":"2023-11-30T18:00:00","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=11493"},"modified":"2023-11-26T13:56:09","modified_gmt":"2023-11-26T11:56:09","slug":"http-header-anzeigen-nginx-fehlersuche-debugging","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/http-header-anzeigen-nginx-fehlersuche-debugging\/","title":{"rendered":"HTTP-Header anzeigen: Fehlersuche\/Debugging im Nginx Webserver\/Reverse Proxy"},"content":{"rendered":"<p>Nginx ist ein verbreiteter Webserver, der auch weitere Funktionen anbietet und daher z.B. als Reverse Proxy laufen kann. Gerade da kann es passieren, dass etwas nicht richtig funktioniert &#8211; warum ist nicht ersichtlich. Im schlimmsten Falle liefert die hinter dem Reverse Proxy liegende Anwendung keine weitere Informationen und ist gar propriet\u00e4r, sodass man dort wenig bis gar nicht eingreifen kann. Nginx bietet verschiedene M\u00f6glichkeiten zur Fehlersuche, die bedingt durch die Architektur teils etwas komplexer sind.<\/p>\n<h2 class=\"wp-block-heading\">Grundlegende Anlaufstellen<\/h2>\n<p>Bevor man tiefer gehend mit dem Debug-Protokoll im n\u00e4chsten Abschnitt sucht, w\u00fcrde ich es auf den einfacheren Wegen probieren. Das Access-Log liegt meist unter <code class=\"\" data-line=\"\">\/var\/log\/nginx\/access.log<\/code>, sofern nicht anders definiert. In Containern wird es auf stdout geschrieben und l\u00e4sst sich bei Docker beispielsweise mit <code class=\"\" data-line=\"\">docker logs -f $containerName<\/code> abrufen. Darin werden alle Zugriffe protokolliert, sodass man z.B. den HTTP Statuscode sieht, der zur\u00fcckgesendet wurde. Auch das Fehlerprotokoll (<code class=\"\" data-line=\"\">error.log<\/code>) kann hilfreich sein. Nginx protokolliert dort Fehler im Kontext des Webservers, etwa nicht gefundene Dateien. CGI-Programme k\u00f6nnen ihre Logs dort ebenfalls weiterleiten. Je nach Konfiguration befinden die sich in einer anderen Logdatei\/einem anderen Container. Ein Blick in die Protokolle der anderen involvierten Anwendungen schadet nicht, sofern die Anfragen dort ankommen &#8211; etwa der Anwendung, die hinter Nginx l\u00e4uft.<\/p>\n<p>Sollten die Protokolle nicht existieren oder leer sein, m\u00fcssen sie ggf. zun\u00e4chst aktiviert werden. Daf\u00fcr bietet Nginx die Direktiven <code class=\"\" data-line=\"\">access_log<\/code> und <code class=\"\" data-line=\"\">error_log<\/code>. Bei Letzterem unterteilt der Webserver die Ereignisse in <em>warn, error, crit, alert, emerg<\/em>.<sup data-fn=\"9cef4e6f-9d7d-4af6-83f0-90c6d2961b83\" class=\"fn\"><a href=\"#9cef4e6f-9d7d-4af6-83f0-90c6d2961b83\" id=\"9cef4e6f-9d7d-4af6-83f0-90c6d2961b83-link\">1<\/a><\/sup><\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-nginx\" data-line=\"\">error_log \/var\/logs\/nginx\/error.log warn;<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Debuglogs in Nginx<\/h2>\n<p>Sollte das nicht ausreichen, bietet Nginx Debuglogs. Sie protokollieren zahlreiche zus\u00e4tzliche Informationen. Darunter beispielsweise die HTTP-Header und bei der Verwendung als Reverse Proxy mit dem ngx_http_proxy_module Modul ebenfalls die an das Backend-System weitergeleiteten Header. Es gibt nur einen Haken: Diese Debug-Protokolle k\u00f6nnen nicht ohne weiteres aktiviert werden, wie man es etwa aus (neueren) Apache 2.4 Versionen kennt. Dort l\u00e4sst sich dynamisch das LogLevel f\u00fcr bestimmte Module deutlich feiner setzen, etwa so:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-nginx\" data-line=\"\">LogLevel error proxy:trace5<\/code><\/pre>\n<p>Nginx muss dagegen mit Debug-Flag kompiliert werden, damit das <em>debug<\/em> Level zus\u00e4tzlich zu den oben genannten zur Verf\u00fcgung steht.<sup data-fn=\"51288b85-dd3d-4045-8fb7-43785f6f5129\" class=\"fn\"><a href=\"#51288b85-dd3d-4045-8fb7-43785f6f5129\" id=\"51288b85-dd3d-4045-8fb7-43785f6f5129-link\">2<\/a><\/sup> Wie Nginx kompiliert wird, hatte ich<a href=\"https:\/\/u-labs.de\/portal\/c-webserver-selbst-kompilieren-aktuellster-nginx-auf-dem-raspberry-pi\/\" data-type=\"post\" data-id=\"7805\"> in diesem Beitrag bereits gezeigt<\/a>. Allerdings wollte ich die ganzen Abh\u00e4ngigkeiten nicht auf einem produktiven System installieren, nur um dort zeitweise die Debug-Logs nutzen zu k\u00f6nnen. Also habe ich mit folgendem Dockerfile alles in einen Container gepackt:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">FROM debian:stable-slim\nRUN apt-get update \\\n    &amp;&amp; apt-get install -y gcc build-essential libpcre3-dev zlib1g-dev wget\n\nWORKDIR \/tmp\nRUN wget -O nginx.tar.gz https:\/\/nginx.org\/download\/nginx-1.24.0.tar.gz \\\n    &amp;&amp; mkdir \/opt\/nginx-src \\\n    &amp;&amp; tar xf nginx.tar.gz -C \/opt\/nginx-src --strip-components=1\n\nWORKDIR \/opt\/nginx-src\nRUN .\/configure --prefix=\/opt\/nginx --with-debug\nRUN make install\n\nENTRYPOINT [&quot;\/opt\/nginx\/sbin\/nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]<\/code><\/pre>\n<p>Passend dazu eine docker-compose.yml:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-yaml\" data-line=\"\">services:\n  nginx-debug:\n    build: .\n    mem_limit: 1G\n    volumes:\n      - .\/nginx.conf:\/opt\/nginx\/conf\/nginx.conf\n    ports:\n      - 80:80<\/code><\/pre>\n<p>Sowie die Nginx Konfigurationsdatei:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-nginx\" data-line=\"\">#user  nobody;\nworker_processes  1;\n\nerror_log \/dev\/stdout debug;\n\nevents {\n    worker_connections  1024;\n}\n\nhttp {\n    include       mime.types;\n    default_type  application\/octet-stream;\n\n    log_format  main  &#039;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#039;\n                      &#039;$status $body_bytes_sent &quot;$http_referer&quot; &#039;\n                      &#039;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&#039;;\n    # alternativ \/proc\/1\/fd\/1\n    access_log  \/dev\/stdout  main;\n\n    sendfile        on;\n    keepalive_timeout  65;\n\n    server {\n        listen       80;\n        server_name  localhost;\n\n        location \/ {\n            proxy_pass http:\/\/backend-server;\n        }\n    }\n}<\/code><\/pre>\n<p>Das ist bewusst sehr minimalistisch gehalten und verwendet daher HTTP ohne Verschl\u00fcsselung, weil ich zur Eingrenzung des Problems m\u00f6glichst vieles ausschlie\u00dfen wollte. Mit einer eigenen Zertifizierungsstelle signierte TLS-Zertifikate f\u00fcr HTTPS-Verbindungen geh\u00f6rten auch dazu. Au\u00dferdem l\u00e4sst sich dies so f\u00fcr andere Zwecke als Vorlage nutzen, ohne ggf. unn\u00f6tige Module zu enthalten. Wer weitere ben\u00f6tigt, kann diese hinzuf\u00fcgen &#8211; etwa das <code class=\"\" data-line=\"\">http_ssl_module<\/code> f\u00fcr TLS-Verbindungen. Eine Liste aller Module mit ihrem jeweiligen Argument, das zu Aktivierung an den <code class=\"\" data-line=\"\">configure<\/code> Befehl \u00fcbergeben werden muss, steht unter nginx.org bereit.<sup data-fn=\"142e4bf2-a0aa-48df-9576-f6d7e14c2fa4\" class=\"fn\"><a href=\"#142e4bf2-a0aa-48df-9576-f6d7e14c2fa4\" id=\"142e4bf2-a0aa-48df-9576-f6d7e14c2fa4-link\">3<\/a><\/sup><\/p>\n<p>Um das Image mit unserem selbst kompilierten Nginx zu erzeugen und einen Container zu starten, gen\u00fcgen die bekannten Docker Compose Befehle:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">DOCKER_BUILDKIT=0 docker compose up --build<\/code><\/pre>\n<p><code class=\"\" data-line=\"\">DOCKER_BUILDKIT<\/code> verwende ich gerne, um die vollst\u00e4ndige Ausgabe zu erhalten. Docker Compose ab V2 versucht Platz zu sparen, in dem l\u00e4ngere Ausgaben nicht vollst\u00e4ndig angezeigt werden. Das mag in Ordnung sein, wenn alles funktioniert. Gibt es jedoch Probleme, finde ich das \u00e4u\u00dferst ungeschickt, wenn nur Teile der Fehlermeldungen sichtbar sind. Vor allem wenn das nicht der urs\u00e4chliche Fehler war, sondern ein Folgefehler, sodass die relevanten Meldungen nicht zu sehen sind.<\/p>\n<h2 class=\"wp-block-heading\">Einschr\u00e4nkungen<\/h2>\n<p>Achtung: Das Debug-Protokoll schreibt sehr viele Eintr\u00e4ge! Man sollte dies daher <strong>keinesfalls<\/strong> uneingeschr\u00e4nkt auf produktiven Systemen einsetzen. Im besten Falle findet man nichts mehr in den Logs. Im schlimmsten Falle schie\u00dft man es damit ab, weil durch das Protokollieren viel Last generiert wird. Au\u00dferhalb von (kleinen) Testumgebungen sollte daher unbedingt begrenzt werden, f\u00fcr welche Clients Debug-Protokolle angelegt werden. Daf\u00fcr  steht die Direktive <code class=\"\" data-line=\"\">debug_connection<\/code> bereit:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-nginx\" data-line=\"\">events {\n    debug_connection 192.168.1.1;\n}<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Was wird protokolliert?<\/h2>\n<p>Anbei ein Beispiel eines HTTP-Aufrufes. Ich habe wegen der L\u00e4nge ein paar Zeilen gek\u00fcrzt. Man sieht wie zuvor angesprochen s\u00e4mtliche eingehende HTTP-Header und die an den Backend-Server weitergeleiteten. W\u00fcrde man beispielsweise mit <code class=\"\" data-line=\"\">proxy_set_header<\/code> einen Header nur f\u00fcr das Backend setzen, so erscheint dieser nicht bei <em>http header<\/em> &#8211; dies sind die vom Client eingehenden. Sondern weiter unten bei <em>http proxy header<\/em>.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-nginx\" data-line=\"\">nginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http request line: &quot;GET \/login?reqUrl=%2F HTTP\/1.1&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http uri: &quot;\/login&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http args: &quot;reqUrl=%2F&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http exten: &quot;&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 posix_memalign: 0000556B725264E0:4096 @16\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http process request header line\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http header: &quot;Host: localhost&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http header: &quot;User-Agent: Mozilla\/5.0 (X11; Linux x86_64; rv:109.0) Gecko\/20100101 Firefox\/119.0&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http header: &quot;Accept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,*\/*;q=0.8&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http header: &quot;Accept-Language: de,en-US;q=0.7,en;q=0.3&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http header: &quot;Accept-Encoding: gzip, deflate, br&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http header: &quot;Connection: keep-alive&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http header: &quot;Cookie: LAVAGNA_SESSION_ID=xyz&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http header: &quot;Upgrade-Insecure-Requests: 1&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http header: &quot;Sec-Fetch-Dest: document&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http header: &quot;Sec-Fetch-Mode: navigate&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http header: &quot;Sec-Fetch-Site: none&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http header: &quot;Sec-Fetch-User: ?1&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http header done\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 event timer del: 3: 266058067\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 rewrite phase: 0\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 test location: &quot;\/&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 using configuration &quot;\/&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http cl:-1 max:1048576\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 rewrite phase: 2\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 post rewrite phase: 3\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 generic phase: 4\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 generic phase: 5\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 access phase: 6\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 access phase: 7\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 post access phase: 8\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 generic phase: 9\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 generic phase: 10\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http init upstream, client timer: 0\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 epoll add event: fd:3 op:3 ev:80002005\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http script copy: &quot;Host&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http script var: &quot;backend-server&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http script copy: &quot;Connection&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http script copy: &quot;close&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http script copy: &quot;&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http script copy: &quot;&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http proxy header: &quot;User-Agent: Mozilla\/5.0 (X11; Linux x86_64; rv:109.0) Gecko\/20100101 Firefox\/119.0&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http proxy header: &quot;Accept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,*\/*;q=0.8&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http proxy header: &quot;Accept-Language: de,en-US;q=0.7,en;q=0.3&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http proxy header: &quot;Accept-Encoding: gzip, deflate, br&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http proxy header: &quot;Upgrade-Insecure-Requests: 1&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http proxy header: &quot;Sec-Fetch-Dest: document&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http proxy header: &quot;Sec-Fetch-Mode: navigate&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http proxy header: &quot;Sec-Fetch-Site: none&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http proxy header: &quot;Sec-Fetch-User: ?1&quot;\nnginx-debug-1  | 2023\/11\/01 17:46:14 [debug] 7#0: *1 http proxy header:\nnginx-debug-1  | &quot;GET \/login?reqUrl=%2F HTTP\/1.0\nnginx-debug-1  | Host: backend-server\nnginx-debug-1  | Connection: close\nnginx-debug-1  | User-Agent: Mozilla\/5.0 (X11; Linux x86_64; rv:109.0) Gecko\/20100101 Firefox\/119.0\nnginx-debug-1  | Accept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/avif,image\/webp,*\/*;q=0.8\nnginx-debug-1  | Accept-Language: de,en-US;q=0.7,en;q=0.3\nnginx-debug-1  | Accept-Encoding: gzip, deflate, br\nnginx-debug-1  | Upgrade-Insecure-Requests: 1\nnginx-debug-1  | Sec-Fetch-Dest: document\nnginx-debug-1  | Sec-Fetch-Mode: navigate\nnginx-debug-1  | Sec-Fetch-Site: none\nnginx-debug-1  | Sec-Fetch-User: ?1\nnginx-debug-1  | \nnginx-debug-1  | &quot;<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Quellen<\/h2>\n<ol class=\"wp-block-footnotes\">\n<li id=\"9cef4e6f-9d7d-4af6-83f0-90c6d2961b83\">https:\/\/docs.nginx.com\/nginx\/admin-guide\/monitoring\/logging\/ <a href=\"#9cef4e6f-9d7d-4af6-83f0-90c6d2961b83-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 1 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"51288b85-dd3d-4045-8fb7-43785f6f5129\">https:\/\/nginx.org\/en\/docs\/debugging_log.html <a href=\"#51288b85-dd3d-4045-8fb7-43785f6f5129-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 2 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"142e4bf2-a0aa-48df-9576-f6d7e14c2fa4\">https:\/\/nginx.org\/en\/docs\/configure.html <a href=\"#142e4bf2-a0aa-48df-9576-f6d7e14c2fa4-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 3 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Nginx ist ein verbreiteter Webserver, der auch weitere Funktionen anbietet und daher z.B. als Reverse Proxy laufen kann. Gerade da kann es passieren, dass etwas nicht richtig funktioniert &#8211; warum ist nicht ersichtlich. Im schlimmsten Falle liefert die hinter dem Reverse Proxy liegende Anwendung keine weitere Informationen und ist gar propriet\u00e4r, sodass man dort wenig &#8230;<\/p>\n","protected":false},"author":5,"featured_media":11503,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"[{\"content\":\"https:\/\/docs.nginx.com\/nginx\/admin-guide\/monitoring\/logging\/\",\"id\":\"9cef4e6f-9d7d-4af6-83f0-90c6d2961b83\"},{\"content\":\"https:\/\/nginx.org\/en\/docs\/debugging_log.html\",\"id\":\"51288b85-dd3d-4045-8fb7-43785f6f5129\"},{\"content\":\"https:\/\/nginx.org\/en\/docs\/configure.html\",\"id\":\"142e4bf2-a0aa-48df-9576-f6d7e14c2fa4\"}]"},"categories":[78],"tags":[497,983,541],"class_list":["post-11493","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software","tag-docker","tag-dockerfile","tag-nginx"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/11493","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=11493"}],"version-history":[{"count":10,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/11493\/revisions"}],"predecessor-version":[{"id":11667,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/11493\/revisions\/11667"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/11503"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=11493"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=11493"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=11493"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}