【问题原因】前端将三维瓦片请求中“+”号转义为%2B,Nginx接收到转义后的URL后,将其解析为原始“+”号再请求iServer,导致请求异常。 【解决办法】修改Nginx代理配置,强制Nginx使用原始编码进行请求转发。参考nginx配置:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
#include mime.types;
#default_type application/octet-stream;
#sendfile on;
#keepalive_timeout 65;
# 代理调试专用格式(关键)
log_format proxy_debug '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'request_time=$request_time '
'upstream_addr=$upstream_addr '
'upstream_status=$upstream_status '
'upstream_response_time=$upstream_response_time '
'upstream_connect_time=$upstream_connect_time '
'upstream_header_time=$upstream_header_time '
'uri="$uri" '
'request_uri="$request_uri" '
'args="$args"';
# 关键:使用 map 提取路径,避免 decode
map $request_uri $backend_uri {
~^/jnmap/iserver(/.*)$ $1;
default $request_uri;
}
server {
access_log logs/access.log proxy_debug buffer=32k flush=5s;
listen 8081;
server_name localhost,127.0.0.1,172.16.15.64;
location /jnmap/iserver/ {
proxy_pass http://172.16.15.64:8090/iserver$backend_uri;
proxy_set_header ProxyHost $host:8081;
proxy_set_header Accept-Encoding ""; # 关键:关闭 gzip
sub_filter_once off;
sub_filter_types *;
sub_filter 'http://172.16.15.64:8081/iserver' 'http://172.16.15.64:8081/jnmap/iserver';
# sub_filter 'http://172.16.15.64:8090/iserver' 'http://172.16.15.64:8081/jnmap/iserver';
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}