Его
У меня есть проблема, которую я не могу решить.
Когда я запрашиваю свой бэкэнд Springboot, он работает нормально.Пароль спрашивается, когда я аутентифицируюсь, я получаю ответ.
Но, если я сначала вызову внешний интерфейс (базовая аутентификация также работает), но прокси-сервер nginx больше не пересылает запросы в бэкэнд-загрузчик.
Не могли бы вы, пожалуйстапомогите разобраться, что не так с моим конфигом.Я забыл настройку https?
На самом деле, если я выключаю ssl, то он работает отлично.И отключение базовой аутентификации с помощью ssl не решает проблему.
Спасибо за помощь
Вот еще несколько деталей:
- У меня есть приложение реакции, созданное синструмент создания-реакции-приложения.
- Приложение вызывает бэкэнд с пружинной загрузкой.
- Я использую docker для запуска всего этого.
- Я использую https, чтобы предотвратить ввод открытого пароля для обычной аутентификации.
- Я работаю с моим приложением с таким примером: https://myPublicHostname (на порту 443)
- Сервер должен быть доступен с таким именем: https://myPublicHostname/rest/myapi/
Вот моя структура файлов для развертывания:
WebDockerService
\-- my-react-app
\-- public
\-- src
\-- package.json
\-- default.conf
\-- Dockerfile
\-- fullchain.pem
\-- htpasswd
\-- privkey.pem
\-- my-api
\-- my-api-0.0.1-SNAPSHOT.jar
\-- Dockerfile
\-- docker-compose.yml
Вот мой файл Docker-compose
version: '3.1'
services:
frontendwithproxy:
build: ./my-react-app
ports:
- 80:80
- 443:443
springbootbackend:
build: ./my-api
ports:
- 8080:8080
networks:
default:
external:
name: netDev
Вот Dockerfile «my-реагировать-приложение» для сборки сервера nginx
### STAGE 1: Build ###
FROM node:9.11.1 as build
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY package.json /usr/src/app/package.json
RUN npm install --silent
RUN npm install react-scripts -g --silent
COPY . /usr/src/app
RUN npm run build
### STAGE 2: Production Environment ###
FROM nginx:1.13.12-alpine
COPY fullchain.pem /etc/nginx/fullchain.pem
COPY privkey.pem /etc/nginx/privkey.pem
COPY default.conf /etc/nginx/conf.d/default.conf
COPY htpasswd /etc/nginx/conf.d/htpasswd
COPY --from=build /usr/src/app/build /usr/share/nginx/html
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
Вот файл default.conf для nginx
server {
#To redirect http traffic to ssl
listen 80;
return 301 https://myPublicHostname$request_uri;
}
server{
listen 443 ssl;
server_name myPublicHostname;
#root containing react app files
root /usr/share/nginx/html;
#Basic authentication enabling
auth_basic "Restricted Access!";
auth_basic_user_file /etc/nginx/conf.d/htpasswd;
#SSL Settings
ssl_certificate /etc/nginx/fullchain.pem;
ssl_certificate_key /etc/nginx/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_ecdh_curve secp384r1;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA";
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
ssl_stapling on;
ssl_stapling_verify on;
#Location for springboot api
location /rest {
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_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forward-Proto http;
proxy_set_header X-Nginx-Proxy true;
proxy_redirect off;
proxy_pass http://192.168.1.125:8080;
}
}
Вот Dockerfile для бэкэнда Springboot
FROM openjdk:8-jdk-alpine
COPY my-api-0.0.1-SNAPSHOT.jar /opt/my-api/my-api.jar
ENTRYPOINT ["/usr/bin/java"]
CMD ["-jar", "/opt/my-api/my-api.jar", "/opt/my-api/public","/opt/my-api/temp", "/opt/my-api/uploads"]
VOLUME ["/opt/my-api/public","/opt/my-api/temp","/opt/my-api/uploads"]
EXPOSE 8080
edit:
nginx - единственная точка входа.все, что входит, должно достигнуть базовой аутентификации.Я не активирую его на http, потому что не хочу допустить эту потенциальную утечку.Но базовая аутентификация не является проблемой, потому что, когда я ее деактивирую, проблема всегда возникает.
Что еще более удивительно, запросы "GET" бэкэнда, которые получают изображения, работают нормально.Фотографии хорошо отображаются.Они работают в разметке и в поле URL браузера.
Но другие запросы GET, которые возвращают zip или другой тип содержимого, не работают.(не работает так хорошо в разметке, как при вводе в браузер).
edit 2:
На самом деле, похоже, работает.Потому что, когда я использую клиент отдыха и запрашиваю свой ресурс на бэкенде, результат хорошо получается.Также, если я вызываю бэкэнд в приложении winthin реагировать на код, результат приходит.
Но когда я вызываю бэкэнд с href, например:
<a
href={"https://myPublicHostname/rest/my-api/getZipFile?value=1,2,3,4,5"}
target="_blank"
>
, тогда бэкэнд не 't получить запрос get.
Итак, некоторые заголовки отсутствуют!?