Windows WSL2环境下Clojure Pedestal服务curl可访问但浏览器无法加载
问题排查与解决方案
- 检查服务绑定地址
Pedestal服务默认未显式配置host时,仅会绑定127.0.0.1,仅允许WSL2内部环回访问,Windows宿主的浏览器请求无法接入WSL2内部的环回地址。你可以在WSL2终端执行ss -tulpn | grep 8080验证监听地址,若返回结果为127.0.0.1:8080即属于该问题。
解决方法:修改Pedestal启动配置,显式指定host为0.0.0.0:
若使用Docker部署,启动时需将端口映射规则修改为(http/start {::http/routes routes ::http/port 8080 ::http/host "0.0.0.0" ;; 新增该配置项 ::http/type :jetty ::http/join? false})-p 0.0.0.0:8080:8080,不要仅绑定127.0.0.1 - 排查跨域(CORS)规则限制
curl不会校验跨域规则,因此可正常拿到响应结果,但浏览器会校验不同端口/域名的跨域请求。你的ShadowCLJS前端默认端口与Pedestal的8080端口不一致,会触发跨域拦截。
解决方法:在Pedestal拦截器链中添加CORS拦截器,放行前端地址的请求:(def cors-interceptor (cors/allow-origin {:allowed-origins #{"http://localhost:9630" "http://localhost:8700"} :allowed-methods [:get :post :put :delete :options]})) - 验证WSL2端口映射规则
若修改绑定地址后仍无法访问,可在Windows管理员CMD中执行netsh interface portproxy show all,查看是否存在8080端口到WSL2内部IP的映射。若不存在可手动添加:- WSL2终端执行
ip addr show eth0获取WSL2内部IP,格式为172.xx.xx.xx - Windows管理员CMD执行
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=替换为上述WSL2内部IP
- WSL2终端执行
- 检查Windows防火墙拦截
临时关闭Windows Defender防火墙测试访问是否正常,若关闭后可访问,添加入站规则放行8080端口即可。
内容的提问来源于stack exchange,提问作者envymike
相关产品推荐
相关产品推荐

