首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于url页面的nginx动态proxy_pass

基于url页面的nginx动态proxy_pass
EN

Stack Overflow用户
提问于 2018-08-29 20:42:30
回答 1查看 3.6K关注 0票数 2

我目前在我的nginx配置文件中有以下代理传递定义:

代码语言:javascript
复制
location /pass/ {
    proxy_pass http://localhost:9999/pass/;
    proxy_redirect     off;
    proxy_set_header   Host $host;
}

这与预期的一样- /pass请求被转发到在端口9999上运行的应用程序。

现在,我想要做的是使端口转发部分动态如下:

代码语言:javascript
复制
location /pass/<input> {
    {a $port variable here that is evaluated via a script (php?)}
    proxy_pass http://localhost:$port/pass/;
    proxy_redirect     off;
    proxy_set_header   Host $host;
}

发送到/pass/ABCD1234的请求应该转发到端口9898,发送到/pass/ABCD5678的请求应该转发到端口9797。

请注意,流程是动态的-因此,从ABCD1234到9898的映射应该通过某种脚本实现(PHP也许?)根据脚本(一个端口)的输出,proxy_pass应该将请求转发到该端口。

请在这方面提供帮助。

更新:

我不想从URI输入获取proxy_pass端口,而是使用cookie。所以,下面是更新后的代码块:

代码语言:javascript
复制
location /pass/ {
    add_header X-debug-message $host always;
    add_header X-debug-message $cookie_sdmport;
    set $proxyurl http://127.0.0.1:$cookie_theport/pass/;
    add_header X-debug-message $proxyurl;
    proxy_pass $proxyurl;
    proxy_redirect     off;
    proxy_set_header   Host $host;
}

在此代码中,存在301重定向回浏览器的循环。当我切换回静态端口时,它又能工作了!奇怪!X-debug-message中的$proxyurl在浏览器上显示正确。所以,我想知道为什么proxy_pass要做301!

更新2:

最终通过以下设置实现了转发功能:

代码语言:javascript
复制
    set $targetIP 127.0.0.1;
    set $targetPort $cookie_passport;
    proxy_pass http://$targetIP:$targetPort$request_uri;

我不确定为什么上面发布的解决方案总是以301旋转-我猜nginx不喜欢在proxy_pass参数中混合动态和静态部分。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-08-30 02:14:21

您可以使用auth_request模块来完成此操作。不过,它不是默认构建的,您可以通过运行以下命令来查看您是否拥有它:

代码语言:javascript
复制
nginx -V 2>&1 | grep -qF -- --with-http_auth_request_module && echo ":)" || echo ":("

如果你看到一个笑脸,那么你就可以走了。

代码语言:javascript
复制
location ~* /pass/(.*) { <- regex capture for your variable
    auth_request /auth;  <- location to process request
    auth_request_set $proxyurl http://localhost:$upstream_http_x_port/pass/; <- set $proxyurl using value returned in x-port header of your php script
    add_header x-my-variable $1; <- Pass variable from regex capture to auth location
    proxy_pass $proxyurl;
}

然后是处理AUTH子请求的位置:

代码语言:javascript
复制
location /auth {
    internal; <- make location only accessible to internal requests from Nginx
    proxy_set_header x-my-variable $http_x_my_variable; <- pass variable to php
    proxy_pass_request_body off; <- No point sending body to php
    proxy_set_header Content-Length "";
    proxy_pass http://your-php-script/file.php;
}

这个模块实际上是用于访问控制的,所以如果你的php脚本返回响应代码200,那么客户端将被允许访问,如果它返回401或403,则访问将被拒绝。如果你不关心这一点,那就把它设置为总是返回200。

执行所需的任何计算,并让php返回前面定义的头部中的端口:

代码语言:javascript
复制
header('X-Port: 9999');

现在,这将为您的proxy_pass指令端口号设置变量,Nginx将完成其余工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52077768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档