Невозможно получить доступ к Portainer, если в конце / отсутствует. Можно ли получить то же поведение, что и Nginx proxy_pass?

Я пытаюсь настроить Traefik, чтобы заменить настройку обратного прокси-сервера Nginx. Мой домен настроен следующим образом: - Я могу получить доступ к различным службам, используя http://example.com и определяя, какая служба Я должен использовать прокси, используя subpath.

Конфигурация обратного прокси Nginx

Я попытался воссоздать ту же настройку с помощью Traefik. Сначала с помощью ReplacePathRegex, а затем StripPrefix. Мои запросы API работают нормально, но когда я пытаюсь использовать Portainer, запросы, сделанные из веб-браузера, пропускают часть /portainer, что приводит к поломке веб-интерфейса.

Например: я делаю запрос на http://example.com/porttainer. Я получаю ответ, а затем следует делать последовательные запросы следующим образом: http://example.com/portainer/vendor1.css и вместо этого он делает запрос следующим образом: http://example.com/vendor1.css

Есть ли способ настроить поведение Traefik так, чтобы оно точно соответствовало Nginx proxy_pass?

Я нашел этот пост, который дает мне частичное решение: есть ли эквивалент ReverseProxyPass для Apache в Traefik?. Portainer, кажется, работает, когда я делаю запрос на http://example.com/portainer/, добавляя " /" к концу. Я пытался исправить это с помощью forceSlash, но это не внесло никаких изменений.

Текущая настройка Portainer с Traefik

Можно ли заставить его работать с завершающим знаком «/» или без него?

Вот как выглядят запросы в /portainer и /portainer/: /запрос порта

/портанер/запрос

Это моя текущая конфигурация Traefik (я использую только Docker): Конфигурация Traefik


person Jan Jaworski    schedule 21.02.2020    source источник


Ответы (2)


Промежуточное ПО Stripprefix предназначено для удаления префиксов из пути перед пересылкой запроса. В соответствии с вашей конфигурацией все после /portainer и /portainer будет удалено. В вашем случае он также удалит косую черту. Если вам нужно перенаправить / в Portainer, вам нужно использовать portainer (без косой черты), чтобы настроить префикс промежуточного программного обеспечения stripprefix.

person humbaba    schedule 21.02.2020
comment
Это не так, так как мне нужно перенаправить его в/внутрь контейнера Portainer. Это поведение, которое у меня есть с Nginx, которое отлично работает. Без stripPrefix страница вообще не загружается, так как получаю 404 not found. - person Jan Jaworski; 21.02.2020
comment
Извините, я в замешательстве. Хорошо, тогда вам нужен префикс промежуточного программного обеспечения. Но если вы настроите его так, как указано выше, часть пути /portainer/whatever/whatever/... будет просто удалена из пути. если вам нужно перенаправить / в portainer, а ваш префикс должен быть portainer вместо /portainer. - person humbaba; 21.02.2020
comment
Я попытался установить PathPrefix на /portainer/, и поведение было таким же, как и с /portainer. Затем я установил его на portainer и во всех случаях получаю 404. Я также пробовал эти комбинации с stripprefix, и результаты были такими же. - person Jan Jaworski; 21.02.2020
comment
Я также пытался использовать RedirectRegex для перенаправления пользователя с http://example.com/portainer на http://example.com/portainer/, но это не сработало. - person Jan Jaworski; 21.02.2020
comment
Можете ли вы проверить, какой URL-адрес перенаправляется на portainer? У меня есть настройка kubernetes, и я попробовал stripprefix, он работает, как и ожидалось. - person humbaba; 21.02.2020
comment
Где я могу это проверить? Я использую только Docker для своей установки. - person Jan Jaworski; 21.02.2020
comment
Я обновил свой пост с дополнительной информацией. Я надеюсь, что это поможет прояснить мою настройку. - person Jan Jaworski; 21.02.2020

Я нашел решение: https://community.containo.us/t/middleware-to-add-the-if-needed/1895

Вот что мне пришлось добавить к labels в моем контейнере portainer, чтобы он заработал: - traefik.http.middlewares.strip-prefix.chain.middlewares=strip-prefix-1,strip-prefix-2 - traefik.http.middlewares.strip-prefix-1.redirectregex.regex=^(https?://[^/]+/[a-z0-9_]+)$$ - traefik.http.middlewares.strip-prefix-1.redirectregex.replacement=$${1}/ - traefik.http.middlewares.strip-prefix-1.redirectregex.permanent=true - traefik.http.middlewares.strip-prefix-2.stripprefixregex.regex=/[a-z0-9_]+

Это не идеальное решение, поскольку я думаю, что должен быть более простой способ его достижения, но на данный момент он удовлетворяет мои потребности.

person Jan Jaworski    schedule 24.02.2020