使用 iframe 的 Nginx 反向代理中的错误 404

Error 404 in Nginx reverse proxy with iframe

我一直在尝试 运行 一个反向代理来管理 iframe 中的 Grafana 图。我在端口 80 上使用 Apache 和 html 页面,在端口 3000 上使用 Grafana 服务器,在 8081 上使用反向代理的 Nginx。

问题是当我尝试访问 iframe 的内容时代理给我一个 404 错误。为了测试所有内容,我尝试了本地 Grafana 服务器配置和具有 2 个不同 iframe 的远程服务器配置。连接到本地 Grafana 的那个在上传文件时给我一个 Grafana 的一般错误和 404,远程的只有 404。

显然,如果我将每个 link 插入到浏览器中,那么单独拍摄的每个作品都可以正常工作,并且在不使用代理的情况下,它在 iframe 上的工作方式相同。

我不是Nginx专家,配置上可能会有一些错误。作为配置文件,我使用的是 Nginx default.conf 文件,所以我没有触及 nginx.conf 因为我认为我不需要它来达到这个目的。

index.html

<h4>grafana local</h4>
        <iframe src="http://localhost:8081/grafana/d-solo/KXusIR0Mk/test?orgId=1&from=1606211757397&to=1606233357397&panelId=2" width="450" height="200" frameborder="0"></iframe>
<h4>grafana remote</h4>
        <iframe src="http://localhost:8081/salvo/d-solo/s-kg75yZz/stazione-meteo?orgId=1&panelId=8&from=1606215708391&to=1606237308391" width="450" height="200" frameborder="0"></iframe>

default.conf

server {
    listen 8081;
    listen [::]:8081;
    server_name 127.0.0.1;

    location /grafana/ {
       #rewrite (grafana\/).* d-solo/KXusIR0Mk/test?orgId=1&from=1606211757397&to=1606233357397&panelId=2 break;
       proxy_pass http://localhost:3000/;
    } 
    
    location /salvo/ {
        #rewrite (salvo\/).* d-solo/s-kg75yZz/stazione-meteo?orgId=1&panelId=8&from=1606215708391&to=1606237308391 break;   
        proxy_pass http://<ip_remoteGrafana>:<port>/;
    }

}

PS: 远程 Grafana 的 ip 和端口不是我的所以我删除了它们,但在代码中它们在那里 ;)

access.log

::1 - - [26/Nov/2020:14:17:41 +0100] "GET /salvo/d-solo/s-kg75yZz/stazione-meteo?orgId=1&panelId=8&from=1606215708391&to=1606237308391 HTTP/1.1" 302 29 "http://localhost/grafana/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36"
::1 - - [26/Nov/2020:14:17:41 +0100] "GET /login HTTP/1.1" 404 197 "http://localhost/grafana/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36"

error.log

2020/11/26 14:17:41 [error] 101110#101110: *1 open() "/usr/share/nginx/html/login" failed (2: No such file or directory), client: ::1, server: 127.0.0.1, request: "GET /login HTTP/1.1", host: "localhost:8081", referrer: "http://localhost/grafana/"

这是因为什么?

显然代理的 Grafana 需要身份验证(重定向到 /login),这与您的上下文路径不兼容(在您的情况下它必须是 /salvo/login)。您将需要 redirect/content 重写,这将更新您使用的上下文的所有路径 /salvo/。这很复杂而且不太可靠。

但你可能会以某种方式做到这一点,但随后你可能会发现目标 Grafana 不允许嵌入到 iframe 中,或者 Grafana cookies 配置(例如 samesite、secure)也可能是你的 http 应用程序的问题或Grafana 身份验证是一个问题。我会首先使用简单/上下文来尽早发现问题,然后再使用更复杂的上下文路径,例如/salvo/.