目标:在 Windows PowerShell 5.1、PowerShell 7、Git Bash 中,按需自动设置代理,并避免 VPN/内网地址被误代理
很多命令行工具会读取以下环境变量来决定是否走 HTTP 代理:
HTTP_PROXY / HTTPS_PROXY(大写)http_proxy / https_proxy(小写)NO_PROXY / no_proxy:指定哪些地址 不走代理(非常关键,防止 VPN 内网被代理坑死)没有“唯一正确”,只有“兼容性”:
http_proxyHTTP_PROXY✅ 最稳做法:
- 在 Bash(Git Bash/WSL):大写 + 小写都设置
- 在 PowerShell/Windows:大写优先,必要时也补小写
否则会出现经典现象:
典型需要 bypass 的范围:
- localhost, 127.0.0.1
- 192.168.0.0/16
- 10.0.0.0/8
- 172.16.0.0/12
注意:有些程序不支持 CIDR(例如
192.168.0.0/16),这时建议写成192.168.或直接列具体 IP/域名
你遇到的问题本质就是:系统级代理环境变量污染了所有程序(包含浏览器/工具链)。
注册表位置:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment✅ 建议:
- 不要在 Machine 级设置 HTTP_PROXY/HTTPS_PROXY
- 用“Shell Profile”按需注入(下面会讲)
在 PowerShell 里查看:
$PROFILE
如果文件不存在,创建:
New-Item -ItemType File -Path $PROFILE -Force
notepad $PROFILE
将以下内容写入 $PROFILE:
# ---- Auto proxy (only when local proxy port is listening) ----
$proxyPort = 8123
$proxyUrl = "http://127.0.0.1:$proxyPort"
function Test-ListeningPort([int]$Port) {
try {
# Don't pin LocalAddress; 0.0.0.0 / :: should count as listening too
return (Get-NetTCPConnection -State Listen -LocalPort $Port -ErrorAction Stop | Measure-Object).Count -gt 0
} catch {
# Fallback for older/limited environments
return [bool](netstat -ano | Select-String -Pattern "LISTENING" | Select-String -Pattern ":\b$Port\b")
}
}
if (Test-ListeningPort $proxyPort) {
# Upper + lower case for compatibility
$env:HTTP_PROXY = $proxyUrl
$env:HTTPS_PROXY = $proxyUrl
$env:http_proxy = $proxyUrl
$env:https_proxy = $proxyUrl
# Bypass internal networks (VERY IMPORTANT for VPN)
$noProxy = "localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12"
$env:NO_PROXY = $noProxy
$env:no_proxy = $noProxy
Write-Host "Proxy enabled: $proxyUrl"
} else {
Remove-Item Env:\HTTP_PROXY,Env:\HTTPS_PROXY,Env:\http_proxy,Env:\https_proxy -ErrorAction SilentlyContinue
Remove-Item Env:\NO_PROXY,Env:\no_proxy -ErrorAction SilentlyContinue
Write-Host "Remove proxy settings."
}
# ---- End ----
重开一个 PowerShell,然后执行:
gci env:*proxy*
预期:
HTTP_PROXY/HTTPS_PROXY/NO_PROXY...PowerShell 7 的 profile 文件与 PS5 不同。
在 pwsh 里执行:
$PROFILE
常见是:
C:\Users\<你>\Documents\PowerShell\Microsoft.PowerShell_profile.ps1把 第 3.2 节同一段代码粘到 PS7 的 $PROFILE 里即可。
PS5/PS7 可以各自配置;如果你两边都用,建议两边都放一份。
Git Bash 的启动脚本通常是:
~/.bashrc(交互 shell 常用)~/.bash_profile(登录 shell,可能会去 source .bashrc)推荐写到 ~/.bashrc:
# ---- Auto proxy (only when local proxy port is listening) ----
if netstat -an 2>/dev/null | grep -qE '[:.]8123[[:space:]].*LISTEN'; then
export http_proxy="http://127.0.0.1:8123"
export https_proxy="http://127.0.0.1:8123"
export HTTP_PROXY="$http_proxy"
export HTTPS_PROXY="$https_proxy"
# Bypass internal networks / VPN ranges
export no_proxy="localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12"
export NO_PROXY="$no_proxy"
else
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY
fi
# ---- End ----
在 Git Bash 里:
env | grep -i proxy
✅ 最稳(不坑 VPN / 内网)的组合是:
PowerShell:
gci env:*proxy*
Git Bash:
env | grep -i proxy
PowerShell:
netstat -aon | findstr :8123
Get-Process -Id <PID> | Select Name,Id,Path
PowerShell:
curl.exe -vk https://192.168.181.101/
如果你看到类似:
Uses proxy env variable ... 127.0.0.1:8123 → 说明走了代理HTTP/1.1 200 OK → 内网访问正常HTTP_PROXY vs http_proxy:为兼容性建议两种都设置
还没有人评论,抢个沙发吧...