Назад | Перейти на главную страницу

Как использовать Nginx для перезаписи и proxy_pass, сохраняя при этом URL-адрес, введенный пользователем

Я начинающий пользователь Nginx и пытаюсь проксировать следующее:

http://subdomain.example.com/mypage/login
TO
http://some_ip_address/login

(не только / login - на сайте есть и другие контексты, например / static, / api и т. д.)

Хотя я могу функционально выполнить эту работу, пользователь видит http://some_ip_address в их браузере, чего я бы хотел избежать.

Эта конфигурация выглядит так:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile      on;
    keepalive_timeout  3;
    server {
        server_name this_server_ip;
        location /mypage/ {
            proxy_pass http://some_ip_address;
            rewrite ^/mypage/(.*)$ http://some_ip_address/$1 last;
        }
        location / {
          root /var/local/directory/;
        }
    }
}

Чтобы попытаться исправить это, я пробовал комбинации:

Но я либо получаю 404, либо обслуживаю страницу, размещенную на http://subdomain.example.com, т.е. rewrite работает, но proxy_pass нет.

Есть несколько похожих вопросов по serverfault, но, к сожалению, ни один из них, похоже, не затрагивает мою особую разновидность этой проблемы. Примеры вот этот и вон тот.

Любые предложения будут очень признательны, спасибо.

Вы указываете this_server_ip как имя хоста для этого виртуального хоста. Это означает, что этот виртуальный хост не используется ни для каких запросов с доменным именем, но ваш виртуальный сервер nginx по умолчанию используется для запросов для http://subdomain.example.com/.

Вам нужно изменить свой server_name к subdomain.example.com, или добавить default_server к listen директива об этом server block и удалите его из конфигурации nginx по умолчанию.

РЕДАКТИРОВАТЬ: попробуйте эту конфигурацию vhost:

server {
    server_name subdomain.example.com;
    location ~ /(mypage|static/api)/ {
        proxy_pass http://some_ip_address/$1/;
    }
    location / {
      root /var/local/directory/;
    }
}

То есть вам не нужен rewrite оператор вообще, потому что вы проксируете запрос на другой сервер.