如何解决Android端Chrome浏览器访问Elixir plug_cowboy HTTP服务器时出现的ERR_UNSAFE_PORT错误
这个问题的核心原因是Chrome会将特定端口标记为"不安全端口",默认禁止访问这些端口——不管你是在Windows还是Android上运行Chrome,这个规则都是通用的。你之前用Node.js/Python没问题,大概率是因为当时用的是Chrome允许的常规端口(比如3000、5000、8080这类),而这次Plug-Cowboy默认或你配置的端口刚好在Chrome的不安全列表里。
第一步:确认当前使用的端口是否在Chrome的不安全列表中
Chrome的不安全端口包括但不限于:21(FTP)、22(SSH)、23(Telnet)、25(SMTP)、109(POP2)、110(POP3)、135(MSRPC)、139(NetBIOS)、445(SMB)、554(RTSP)、1025-1048、1723(PPTP)、3659、4661(eDonkey)、5060/5061(SIP)、6000(X11)、6665-6669(IRC)、6697等。
你可以先检查你的Plug-Cowboy配置里的端口号,比如在纯Plug项目的启动代码里:
# 看看这里的port是不是上面列表里的 Plug.Cowboy.http MyApp.Plug, [], port: 1080
或者Phoenix项目的config/dev.exs里的端点配置:
config :my_app, MyAppWeb.Endpoint, http: [port: 6667], # 检查这个端口 # ...其他配置
第二步:切换到Chrome允许的安全端口
最直接且无副作用的解决方案就是把端口换成Chrome认可的安全端口,比如8080、3000、4000、5000、8000这些常用端口。
修改配置示例:
- 纯Plug+Cowboy项目:
# 把port改成4000或者其他安全端口 Plug.Cowboy.http MyApp.Plug, [], port: 4000
- Phoenix项目:
config :my_app, MyAppWeb.Endpoint, http: [port: 4000], # ...保持其他配置不变
修改后重启服务器,再用Android Chrome访问,应该就能正常加载了。
为什么Node.js/Python之前没出现这个问题?
因为Node.js(比如Express默认3000)、Python(比如Flask默认5000)的常用默认端口都不在Chrome的不安全端口列表里,所以你之前没碰到这个问题。而Plug-Cowboy的默认端口如果是你自己指定的,刚好踩中了Chrome的禁用列表,就会触发这个错误。
(可选)如果必须使用不安全端口的处理方式(不推荐)
如果因为业务需求必须使用那个被Chrome禁用的端口,Android上的Chrome可以通过添加启动参数绕过这个限制,但操作比Windows麻烦:
- 你需要通过ADB命令启动Chrome并添加
--explicitly-allowed-ports=XXX参数(XXX是你要用的端口),比如:
adb shell am start -n com.android.chrome/com.google.android.apps.chrome.Main --es "command_line" "--explicitly-allowed-ports=1080"
不过这种方式每次启动Chrome都需要这么操作,而且对于普通用户来说门槛较高,还是优先推荐切换到安全端口。
内容的提问来源于stack exchange,提问作者faBri_CI-o

