Ktor 1.6.8如何配置支持超8KB大HTTP请求头避免400错误
Ktor 1.6.8 大请求头返回400问题解决方案
Ktor 1.6.8版本中通用配置项maxHeaderLength未完成各引擎层的参数映射,直接在配置文件中设置不会生效,需要针对使用的服务端引擎单独调整底层参数,即可支持长度约16000字符的请求头,具体配置方式如下:
Tomcat引擎配置
Tomcat引擎的请求头限制由底层连接器的maxHttpHeaderSize参数控制,单位为字节,16000字符约占16KB空间,建议设置为32768(32KB)预留冗余,配置代码如下:
import io.ktor.server.tomcat.* import org.apache.coyote.http11.AbstractHttp11Protocol fun main() { embeddedServer(Tomcat, port = 8080) { // 此处编写路由、插件等常规业务配置 }.apply { // 遍历所有连接器调整请求头上限 tomcatContext.parent?.connectors?.forEach { connector -> val protocol = connector.protocolHandler as AbstractHttp11Protocol<*> protocol.maxHttpHeaderSize = 32768 } }.start(wait = true) }
如果是通过EngineMain配合application.conf启动的项目,需要自定义Tomcat引擎工厂实现上述参数调整逻辑,无法直接通过配置文件修改该参数。
Netty引擎配置
Netty引擎可直接在引擎启动配置块中修改httpMaxHeaderSize参数调整请求头上限,单位为字节,配置代码如下:
import io.ktor.server.netty.* fun main() { embeddedServer(Netty, port = 8080, configure = { httpMaxHeaderSize = 32768 // 设置为32KB,满足16000字符请求头需求 } ) { // 此处编写路由、插件等常规业务配置 }.start(wait = true) }
注意事项
- 1.6.x分支的Ktor未修复通用
maxHeaderLength配置不生效的问题,该配置直到2.x正式版本才打通全引擎的参数映射,低版本不要依赖该配置项 - 参数设置不要卡16000字节的阈值,预留至少1倍冗余,避免多字节字符编码、网关自动附加头导致的大小溢出
- 如果服务前方部署有Nginx、API网关等反向代理组件,需要同步调整代理层的请求头大小限制,否则请求会在到达Ktor服务前被拦截
内容的提问来源于stack exchange,提问作者Suneel
相关产品推荐
相关产品推荐

