Config nginx регистр не учитывает регистр - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть 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 / ... anotherdomain.es/service/...

mydomain.com / vm2 / ... anotherdomain.es/vm2/...

mydomain.com / vm3 / ... anotherdomain.es/vm3/...

mydomain.com / ... anotherdomain.es/...

Перенаправляет весь трафик c из местоположения на соответствующий сервер. Остальная часть URL (включая параметры) не вызывает проблем c и имеет верхний и нижний регистр.

Но мне нужно, чтобы места не учитывали регистр. И чтобы иметь к нему доступ (или любую другую комбинацию):

mydomain.com / Service / ... anotherdomain.es/SERVICE/...

mydomain .com / VM2 / ... anotherdomain.es/Vm2/...

Я не хочу повторять местоположения или повторять конфигурацию каждого из них. Я хотел бы сделать это лучше и эффективнее.

Я пробовал с регулярными выражениями, но проверка синтаксиса дает мне ошибки, и это не работает. Например, этот:

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

Ошибка:

nginx: [emerg] "proxy_pass" не может иметь часть URI в местоположении, заданном регулярным выражением, или внутри именованного местоположения или внутри оператора if, или внутри блока limit_except в / etc / nginx / sites-enabled / my-sites: 4 nginx: файл конфигурации /etc/nginx/nginx.conf не пройден

И это также может быть так: mydomain.com/vm2/service/15 (это регулярные выражения, это будет 2)

Я посмотрел и много пробовал, но я не не вижу ничего, что работает для меня. Любые идеи? Спасибо.

1 Ответ

0 голосов
/ 23 апреля 2020

С подсказкой Ричарда Смита , что я видел и новыми чтениями (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;
}

А теперь "service" или "vmX" с регистром нечувствительности, что означает Service или SERVICE или serVice или VM2.

Надеюсь, это поможет другим nginx неопытные люди, как я.

...