开发者社区 问答 正文

nginx 访问外部请求报403:提示没有权限访问该URL?

nginx 配置如下: (/login的请求:proxy_set_header Host $proxy_host 配置会报403)

server {

listen       8092;
    server_name  192.168.2.x;

location /login {
    proxy_pass   https://flow.polar.com;
    proxy_set_header   X-ForwardeProto $scheme;
    proxy_set_header   Host              $proxy_host;
    proxy_set_header   X-Real-IP         $remote_addr;
} 
}

nginx 使用以下方式配置是/login 是成功的,但是有点小问题

(/login的请求:proxy_set_header Host $http_host)

server {

listen       8092;
    server_name  192.168.2.x;

location /login {
    proxy_pass   https://flow.polar.com;
    proxy_set_header   X-ForwardeProto $scheme;
    proxy_set_header   Host              $http_host;
    proxy_set_header   X-Real-IP         $remote_addr;
}
}

小问题如图描述 虽然是200 状态,但是因为我配置的proxy_set_header Host $http_host;请求头还是,我本地的信息

不代理前的

不使用代理直接访问 nginx 要怎么配置,才能完成这个登录操作?我把配置成proxy_set_header Host $proxy_host; 会报403

展开
收起
2xftxrr4in4aw 2021-07-08 18:31:59 1066 分享 版权
阿里云 AI 助理回答

根据你的描述,问题出在proxy_set_header Host的配置上。当你设置为$proxy_host时,由于这不是一个标准的Nginx变量,因此导致了403错误。而使用$http_host虽然能成功代理请求,但Host头信息没有被正确地替换为目标服务器的主机名,而是保留了原始请求的Host信息。

要解决这个问题,你应该将proxy_set_header Host配置为目标服务器的实际主机名,而不是使用$proxy_host或保留本地的$http_host。正确的做法是直接指定目标服务器的主机名,或者使用变量$host(如果它是从客户端请求中继承过来的,并且你希望保持这种行为),但在大多数情况下,直接写目标URL的主机部分是最清晰和直接的。

修改配置如下:

server {
    listen       8092;
    server_name  192.168.2.x;

    location /login {
        proxy_pass   https://flow.polar.com;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Host              flow.polar.com; # 直接指定目标主机名
        proxy_set_header   X-Real-IP         $remote_addr;
    }
}

这样配置后,当访问/login时,Nginx会将请求转发到https://flow.polar.com,并且在请求头中设置正确的Host: flow.polar.com,从而避免了403错误,并确保请求被正确路由到目标服务器。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答