У меня есть простая задача с nginx, но я не могу ее решить:
У меня есть домен example.com
, который указывает на локальный сервер 192.168.1.150
, на котором работает nginx в докере.
Но у меня есть другой контейнер, «myapp», работающий на порту 8080, и я хочу передать это местоположение — с «https://192.168.1.150/myapp» и «https://example.com/myapp» на «http://192.168.1.150:8080", который является только http, и я хочу иметь безопасное соединение через nginx.
Проблема, которую нужно решить
На данный момент, если я запрашиваю https://192.168.1.150/myapp
, он переходит к https://192.168.1.150/login
, но цель должна быть https://192.168.1.150/myapp/login
. Хотя URL успешно «меняется», nginx отвечает HTTP 404;
Смотрите мои настройки местоположения в nginx.conf:
location /myapp {
proxy_pass http://192.168.1.150:8080;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $http_host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
SSL
Просто примечание: я уже настроил SSL с перенаправлением с HTTP, протестировал простое местоположение «/ test», которое возвращает обычный текст «ОК», выглядит нормально.
Если это не может быть решено таким образом, я также могу использовать его с другим сервером и слушать другой порт, кроме 443. (пробовал, тот же результат)
Любая помощь будет оценена! Заранее спасибо.
Да спасибо. Мне пришлось переписать request_uri следующим образом: rewrite ^/myapp(.*) $1? break;
Попробуйте это, может это то, что вам нужно:
прокси_пасс http://myapp;
Для этого я должен определить upstream myapp { server 192.168.1.150:8080 }
правильно? Такое же поведение.
Нет в вашем коде попробуйте myapp вместо 192.168.1.150:8080
Не работает. То, что мне нужно было использовать rewrite ^/myapp(.*) /$1/$2 break;
, но это не подходит для статических файлов или сложных приложений. Только что протестировано с простым http.server с python.
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
Итак, отвечая на мой собственный вопрос: мне пришлось переписать uri для правильного перенаправления. У меня не было подходящих слов, чтобы найти информацию в сети, но такие ключевые слова, как «сохранить», помогли найти примеры.
Решение состояло в том, чтобы использовать модуль перезаписи nginx и написать замену для раздела «myapp»: rewrite ^/myapp(.*) $1? break;
.
Больше информации на ngx_http_rewrite_module.html и поиск «замена».
Итак, на данный момент мой рабочий конфиг с простым Python http.server:
location /myapp/ {
rewrite ^/myapp(.*) $1? break;
proxy_pass http://myapp$is_args$args;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $http_host$request_uri;
proxy_cache_bypa $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_f>
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
Другие перенаправления на веб-приложения и серверы не работают, но мой вопрос решен.
У меня также были проблемы без завершающей косой черты, например example.com/myapp
, nginx сбросил HTTP 500, что я преодолел с помощью этого:
location ~ ^/myapp$ {
return 301 $request_uri/;
}
Спасибо за помощь!
Вы говорите, что вас перенаправили? Затем само приложение неправильно перенаправляет пользователя на /login вместо /myapp/login.