我遇到一个问题,当我反向代理页面时,找不到文件的相对路径。
工作示例:
https://lfportal.mohavecounty.us/bos/search.aspx?dbid=0&searchcommand=%28%7B%5BBOS%20Agenda%20Packets%5D%3A%5BMeeting%20Date%5D%3D%2211/23/2020%22%7D%20%26%20%7B%5BBOS%20Agenda%20Packets%5D%3A%5BMeeting%20Type%5D%3D%22Special%22%7D%20%26%20%7B%5BBOS%20Agenda%20Packets%5D%3A%5BItem%20Number%5D%3D%22Item%20001%22%7D%29%20
重定向到搜索结果:
https://lfportal.mohavecounty.us/bos/0/doc/1652027/Page1.aspx
在文件 Page1.aspx 中,有使用相对路径的路径,如下例所示
<img id="A_T0_0_1" unselectable="on" src="../../../Helper/TileData.aspx?reposName=MohaveDocs&docID=1652027&x=0&y=1&pageNum=1&scale=3782&ro=0&time=1607098159588&showAnn=1&pageID=7493796&search=">
现在有了我的重定向
https://lfdocs.mohave.gov/bos/search.aspx?dbid=0&searchcommand=%28%7B%5BBOS%20Agenda%20Packets%5D%3A%5BMeeting%20Date%5D%3D%2211/23/2020%22%7D%20%26%20%7B%5BBOS%20Agenda%20Packets%5D%3A%5BMeeting%20Type%5D%3D%22Special%22%7D%20%26%20%7B%5BBOS%20Agenda%20Packets%5D%3A%5BItem%20Number%5D%3D%22Item%20001%22%7D%29%20
页面加载但无法继续,因为失败了。它给出了 404 错误,在 Chrome 开发者中查看上图的地址,404 错误显示地址:
https://lfdocs.mohave.gov/Helper/TileData.aspx?reposName=MohaveDocs&docID=1652027&x=0&y=1&pageNum=1&scale=3782&ro=0&time=1607098058369&showAnn=1&pageID=7493796&search=
因此看起来根文件夹 bos 丢失了。 https://lfdocs.mohave.gov/Helper/TileData.aspx?
应为网址: https://lfportal.mohavecounty.us/bos/Helper/TileData.aspx?
因此,我的代理传递似乎没有正确处理相对属性。下面是我的 Nginx 站点配置示例。问题发生在第二个 if 条件中
if ($saved_redirect_location !~* "10.4.1.81") { .. }
我的配置文件:
server{
listen 443 ssl http2; # default_server;
server_name lfdocs.mohave.gov;
access_log /var/log/nginx/lfdocs_mohave_gov_access.log;
error_log /var/log/nginx/lfdocs_mohave_gov_error.log info;
include /etc/nginx/sites-available/mohave_gov_ssl.conf;
location / {
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_pass http://10.4.1.81/;
# This is used to handle the multiple redirect 301 that the server is doing
proxy_intercept_errors on;
error_page 301 302 307 = @handle_redirects;
}
location @handle_redirects {
set $saved_redirect_location '$upstream_http_location';
if ($saved_redirect_location ~* "10.4.1.81") {
add_header X-debug-message 1$saved_redirect_location always;
proxy_pass $saved_redirect_location;
}
if ($saved_redirect_location !~* "10.4.1.81") {
add_header X-debug-message http://10.4.1.81$saved_redirect_location always;
proxy_pass http://10.4.1.81$saved_redirect_location;
}
}
}
在 Chrome 开发者工具中,我查看自定义标题 x-debug-message 并具有以下值:
x-debug-message: http://10.4.1.81/bos/0/doc/1652027/Page1.aspx
我曾尝试从我读过的一篇文章中删除位置部分下方的尾随斜杠,但没有成功。
关于为什么相对路径无法加载,有什么想法吗?
答案1
相对路径由您的后端应用程序添加。nginx 不会以任何方式触及路径。
如果您的后端应用程序使用相对路径,那么您的前端 URL 必须与后端 URL 位于同一深度。
在您的第一个例子中:
https://lfportal.mohavecounty.us/bos/0/doc/1652027/Page1.aspx
URL 位于第四级子目录。这意味着浏览器可以解析../../../
到/bos
。
在你的第二个例子中:
https://lfdocs.mohave.gov/bos/search.aspx?dbid=0&searchcommand=%28%7B%5BBOS%20Agenda%20Packets%5D%3A%5BMeeting%20Date%5D%3D%2211/23/2020%22%7D%20%26%20%7B%5BBOS%20Agenda%20Packets%5D%3A%5BMeeting%20Type%5D%3D%22Special%22%7D%20%26%20%7B%5BBOS%20Agenda%20Packets%5D%3A%5BItem%20Number%5D%3D%22Item%20001%22%7D%29%20
URL 位于第二级子目录。现在,浏览器尝试解析../../../
URL,最终得到/
URL。
我的建议是将相对 URL 替换为站点根目录相对 URL:/bos/Helper/TileData.aspx?reposName=MohaveDocs&docID=1652027&x=0&y=1&pageNum=1&scale=3782&ro=0&time=1607098159588&showAnn=1&pageID=7493796&search
您的 URL 的另一个问题是,“与”符号经过了 URL 编码,这可能会导致不良的最终结果。