基于Yaws的Nitrogen设置Cookie抛出异常求助
环境信息
- Nitrogen 2.4.0
- Yaws 2.0.8
- ERTS 13.2 - R25
问题现象
访问http://0.0.0.0:8000/时返回「Internal server error」,控制台输出以下错误栈:
{error,first_request, {url,"b_server/"}, {throw, {badarg,same_site}, [{yaws_api,cookie_option,2,[{file,"src/yaws_api.erl"},{line,725}]}, {yaws_api,'-set_cookie/3-fun-0-',2, [{file,"src/yaws_api.erl"},{line,734}]}, {lists,foldl,3,[{file,"lists.erl"},{line,1350}]}, {yaws_api,set_cookie,3,[{file,"src/yaws_api.erl"},{line,733}]}, {yaws_simple_bridge,'-assemble_headers/1-lc$^0/1-1-',1, [{file,"src/yaws_bridge_modules/yaws_simple_bridge.erl"}, {line,215}]}, {yaws_simple_bridge,assemble_headers,1, [{file,"src/yaws_bridge_modules/yaws_simple_bridge.erl"}, {line,215}]}, {yaws_simple_bridge,build_response,2, [{file,"src/yaws_bridge_modules/yaws_simple_bridge.erl"}, {line,161}]}, {wf_core,run,0,[{file,"src/wf_core.erl"},{line,23}]}]}}
Crash Handler Crashed: {throw,{badarg,same_site}, [{yaws_api,cookie_option,2,[{file,"src/yaws_api.erl"},{line,725}]}, {yaws_api,'-set_cookie/3-fun-0-',2, [{file,"src/yaws_api.erl"},{line,734}]}, {lists,foldl,3,[{file,"lists.erl"},{line,1350}]}, {yaws_api,set_cookie,3,[{file,"src/yaws_api.erl"},{line,733}]}, {yaws_simple_bridge,'-assemble_headers/1-lc$^0/1-1-',1, [{file,"src/yaws_bridge_modules/yaws_simple_bridge.erl"}, {line,215}]}, {yaws_simple_bridge,assemble_headers,1, [{file,"src/yaws_bridge_modules/yaws_simple_bridge.erl"}, {line,215}]}, {yaws_simple_bridge,build_response,2, [{file,"src/yaws_bridge_modules/yaws_simple_bridge.erl"}, {line,161}]}, {wf_core,run_crash,4,[{file,"src/wf_core.erl"},{line,46}]}]}
问题成因
核心错误为{badarg,same_site},根源是Yaws 2.0.8不支持SameSite Cookie属性,而Nitrogen 2.4.0在生成响应Cookie时会自动添加SameSite参数,导致Yaws的yaws_api:cookie_option/2函数无法识别该参数,抛出参数错误。
解决方案
方案1:升级Yaws版本
Yaws从2.1.0版本开始正式支持SameSite Cookie属性,直接升级到2.1.0及以上版本即可解决该兼容问题。
方案2:修改SimpleBridge代码(不升级Yaws时)
找到Nitrogen依赖的yaws_simple_bridge.erl文件,定位到assemble_headers/1函数(第215行附近),在调用yaws_api:set_cookie/3前过滤掉Cookie选项中的same_site参数:
% 修改后代码示例 FilteredOptions = proplists:delete(same_site, Options), yaws_api:set_cookie(Name, Value, FilteredOptions),
方案3:禁用Nitrogen的SameSite Cookie设置
在Nitrogen的配置文件(如site.config)中,修改Cookie配置,关闭SameSite参数的自动生成:
{nitrogen, [ {cookie_options, [ % 移除或注释掉same_site相关配置项 % {same_site, lax} ]} ]}
内容的提问来源于stack exchange,提问作者Vianney Sserwanga
相关产品推荐
相关产品推荐

