我正在尝试根据URL使用Nginx进行反向代理。我希望将http://mydomain.example.com/client1/...重定向到http://127.0.0.1:8193/...。我尝试了很多方法,但没有一个起作用。请注意,该应用程序可以进行重定向。这些是我上一个解决方案的配置文件:

默认

server {
    listen                  80;
    server_name             mydomain.example.com;

    location / {
            set $instance none;
            if ($request_uri ~ ^/(.*)/$) {
                    set $instance $1;
            }

            set $no_cookie true;
            if ($http_cookie ~ "instance=([^;] +)(?:;|$)") {
                    set $instance $1;
                    set $no_cookie false;
            }

            if ($no_cookie = true) {
                    add_header Set-Cookie "instance=$instance;Domain=$host;Path=/";
                    rewrite ^ / break;
            }

            include instances.conf;
    }


instance.conf

proxy_redirect                 off;
proxy_set_header               Host $host;
proxy_set_header               X-Real-IP $remote_addr;
proxy_set_header               X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_connect_timeout          90;
proxy_send_timeout             60;

# Installation of language packs, etc. can take a long time
proxy_read_timeout             10800;

if ($instance = client1) {
    proxy_pass http://127.0.0.1:8193;
}

if ($instance = client2) {
    proxy_pass http://127.0.0.1:8194
}

...


当浏览器请求http://mydomain.example.com/client1/时,Nginx应该使用值instance设置一个名为client1的cookie,然后将流量重定向到适当的代理。对于后续查询,它应使用此cookie进行重定向。我的问题是它永远不会将$instance变量设置为client1。不要忘记该应用程序不知道前缀/client1

你有好主意吗?您知道更好的解决方案吗?

最佳答案

用于获取Cookie的正则表达式是错误的。我已将其更改为

"instance=([^;][^ ]+)(?:;|$)"


现在就可以了。

编辑:最终只是解决方案的一部分。对不起。仍然有问题。请参阅下面我的评论。

关于configuration - nginx反向代理:如何实现?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11110669/

10-09 06:50