使用 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/
.
我一直在尝试 运行 一个反向代理来管理 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/
.