NGINX重定向返回414 Request-URI Too Large错误的解决方案咨询
Hey Max,看了你遇到的414错误问题,我来帮你分析下可能的原因和解决办法~
首先,先看你提供的完整NGINX配置,发现你那个负责重定向的127.0.0.3 server块有点问题:你既在server级别写了return 301 $scheme://127.0.0.1$request_uri;,又在下面保留了原本属于127.0.0.1的location代理配置。这会导致NGINX处理请求时逻辑混乱,甚至可能出现隐性的请求循环或者URI被重复拼接的情况,这很可能是触发414错误的核心原因。
第一步:修正重定向server块的配置
把127.0.0.3的server块简化成纯重定向逻辑,去掉多余的location配置,正确的配置应该是这样:
server { listen 80; listen [::]:80; server_name 127.0.0.3; # FOR STAGING ONLY error_log /var/log/nginx/error.log error; access_log /var/log/nginx/access.log combined; # 只保留重定向指令,所有请求直接跳转到新地址 return 301 $scheme://127.0.0.1$request_uri; }
这样所有访问127.0.0.3的请求都会直接被301重定向到127.0.0.1对应的URI,不会进入多余的location处理逻辑,避免URI被意外拼接。
第二步:处理URI过长的基础配置
如果修正后还是出现414错误,那可能是原请求的URI本身确实过长,这时候需要调整NGINX的请求头缓冲参数,来支持更长的URI。你可以在http块或者对应的server块里添加以下配置:
# 调整请求头缓冲大小,支持更长的URI client_header_buffer_size 16k; large_client_header_buffers 4 64k;
client_header_buffer_size:设置默认的请求头缓冲大小large_client_header_buffers:设置当请求头超过默认大小后的缓冲数量和单块大小,这里设置成4个64k的缓冲,足够处理大部分超长URI场景
第三步:检查是否存在重定向循环
虽然从你的配置看不太可能,但还是要确认下:127.0.0.1的server块代理的website:8301服务,有没有可能又把请求跳回127.0.0.3?如果有这种情况,就会导致URI不断被拼接,最终超出长度限制触发414。你可以查看NGINX的error.log,看看有没有循环重定向的相关日志。
按照上面的步骤调整后,应该就能解决你遇到的414错误了。
备注:内容来源于stack exchange,提问作者MaxDragonheart

