Browser-sync代理自定义域名返回HTTP 403无权限错误的配置排查
你对browser-sync的proxy参数作用理解有误。你配置的proxy是browser-sync后端要拉取内容的源站地址,不是browser-sync对外提供服务的访问域名。你现在把自定义域名指向本地IP,默认访问的是本地443端口的服务,而browser-sync默认监听3000端口,请求根本没有进入browser-sync的处理流程,所以才会返回403。
你可以按以下步骤排查和解决问题:
- 先确认本地443端口占用情况
打开命令行执行netstat -ano | findstr ":443",查看占用443端口的进程PID,确认该进程对应的服务:
- 如果是Nginx、Apache、IIS等Web服务,说明请求是被该服务拦截返回403,和browser-sync无关
- 如果没有任何进程占用443端口,再继续后续排查
- 如需直接用自定义域名访问browser-sync代理后的服务,两种可选方案:
方案一:修改browser-sync配置,直接监听443端口
修改你的gulpfile.js中的browser-sync配置,增加端口和域名绑定参数:
let browserSync = require('browser-sync').create(); gulp.task('browser-sync', function(){ browserSync.init( { open: true, injectChanges: true, // 将原来的字符串proxy改成对象形式,方便配置请求头 proxy: { target: 'https://generalgulp.devsunset', proxyReq: [ function(proxyReq) { // 手动设置请求头Host,避免源站校验不通过 proxyReq.setHeader('Host', 'generalgulp.devsunset'); } ] }, host: 'generalgulp.devsunset', port: 443, // 直接监听HTTPS默认端口,访问域名无需加端口 serveStatic: ['.'], https: { key: 'C:\\WebProjects\\GeneralGulp\\resources\\certificates\\server-generalgulp.key', cert: 'C:\\WebProjects\\GeneralGulp\\resources\\certificates\\server-generalgulp.crt' } }); });
注意启动Gulp任务时需要管理员权限,否则无法绑定1024以下的端口。
方案二:本地配置Nginx反向代理
如果不想让browser-sync直接占用443端口,可以在本地安装Nginx,添加如下站点配置,将自定义域名的请求转发到browser-sync的3000端口:
server { listen 443 ssl; server_name generalgulp.devsunset; ssl_certificate C:/WebProjects/GeneralGulp/resources/certificates/server-generalgulp.crt; ssl_certificate_key C:/WebProjects/GeneralGulp/resources/certificates/server-generalgulp.key; location / { proxy_pass https://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
- 源站权限校验排查
如果上述配置修改后还是返回403,检查你proxy指向的源站服务(也就是原本跑在generalgulp.devsunset的服务)是否做了访问限制:
- 是否限制了只能从特定IP、特定Host头访问
- 是否开启了CSRF校验、身份校验,未携带合法凭证的请求会被拦截
- 查看源站服务的日志,确认403错误的具体触发原因
内容的提问来源于stack exchange,提问作者LeonNguyen
相关产品推荐
相关产品推荐

