首页 > 解决方案 > 配置 nginx 多个位置不区分大小写

问题描述

我将我的 nginx 作为反向代理设置,如下所示:

server {
    listen 80;
    server_name mydomain.com anotherdomain.es 20.18.4.140;
        location ^~ /service/ {
        proxy_pass http://20.18.4.146/;
        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_set_header X-Forwarded-Proto $scheme;
    }

    location ^~ /vm2/ {
        proxy_pass http://20.18.4.146/;
        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_set_header X-Forwarded-Proto $scheme;
    }

    location ^~ /vm3/ {
        proxy_pass http://20.18.4.142:6001/;
        #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_set_header X-Forwarded-Proto $scheme;
    }       location / {
        proxy_pass http://20.18.4.148/;
        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_set_header X-Forwarded-Proto $scheme;
    } }

server {
    listen 443 ssl;
    server_name mydomain.com anotherdomain.es 20.18.4.140;

    fastcgi_param HTTPS on;
    include /etc/nginx/include/ssl;
        location ^~ /service/ {
        proxy_pass https://20.18.4.146/;
        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_set_header X-Forwarded-Proto $scheme;
    }

    location ^~ /vm2/ {
        proxy_pass https://20.18.4.146/;
        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_set_header X-Forwarded-Proto $scheme;
    }       

    location ^~ /vm3/ {
        proxy_pass https://20.18.4.142:6000/;
        #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_set_header X-Forwarded-Proto $scheme;
    }

    location / {
        proxy_pass https://20.18.4.148/;
        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_set_header X-Forwarded-Proto $scheme;
    } 
}

现在我以这种方式正确访问它:

mydomain.com/service/...另一个域.es/service/...

mydomain.com/vm2/...另一个域.es/vm2/...

mydomain.com/vm3/...另一个域.es/vm3/...

mydomain.com/...另一个域名.es/...

将所有流量从某个位置重定向到适当的服务器。url 的其余部分(包括参数)没有问题,并且有大写和小写。

但我需要这些位置不区分大小写。并且能够像这样(或任何其他组合)访问它:

mydomain.com/Service/...另一个域.es/SERVICE/...

mydomain.com/VM2/...另一个域.es/Vm2/...

我不想重复位置或重复每个位置的配置。我想做得更好,更有效率。

我尝试过使用正则表达式,但检查语法会给我带来错误并且它不起作用。比如这个:

~* ^/(vm2|Vm2|VM2)/$
~* ^/vm2/
~* /(<vm2>/g)
~* /app1/(.*)
...

错误:

nginx:[emerg]“proxy_pass”不能在正则表达式给出的位置、命名位置、“if”语句或/etc/nginx/sites-enabled/my-sites中的“limit_except”块中包含URI部分:4 nginx:配置文件 /etc/nginx/nginx.conf 测试失败

也可能是这种情况:mydomain.com/vm2/service/15(作为正则表达式,它将是 2)

我已经看过并尝试了很多,但我没有看到任何适合我的东西。有任何想法吗?谢谢。

标签: nginxcase-insensitive

解决方案


根据Richard Smith的线索,我所看到的和新的读数(nginx-case-insensitive-location)我把它留在了那里:

location ~* /service(?<stuff>.*)$  {
    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_set_header X-Forwarded-Proto $scheme;
    rewrite ^ /$stuff break;
    proxy_pass http://20.18.4.146;
}

... 
...ssl
...

location ~* /service(?<stuff>.*)$  {
    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_set_header X-Forwarded-Proto $scheme;
    rewrite ^ /$stuff break;
    proxy_pass https://20.18.4.146;
}

...

location / {
    proxy_pass https://20.18.4.148/;
    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_set_header X-Forwarded-Proto $scheme;
}

现在“服务”或“vmX”带有区分大小写,表示服务或服务或服务或 VM2。

我希望它可以帮助像我这样的其他 nginx 没有经验的人。


推荐阅读