将应用程序 URL 从一个选项卡复制到另一个选项卡导致 404 错误

Posted

技术标签:

【中文标题】将应用程序 URL 从一个选项卡复制到另一个选项卡导致 404 错误【英文标题】:Copying application url from one tab to another tab causing 404 error 【发布时间】:2020-03-17 10:25:07 【问题描述】:

我有一个应用程序,其后端在 Spring Boot 中,字体以 Angular 结尾,我正在使用微服务。我已经对每个服务进行了 docarize,它运行时没有任何问题。复制应用程序时遇到的问题登录后作为 docker-compose up 运行时的 URL 并将其粘贴到浏览器的另一个选项卡中,我收到 404 错误。但是在本地,当我做同样的事情时它没有发生。将本地 URL 复制到其他选项卡后,将我重定向到登录页面。 我无法弄清楚问题并寻找某种线索。

这是 Angular docker 文件:

# base image
FROM node:10.16.0-alpine AS build-step
# set working directory
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:1.16.1-alpine
COPY --from=build-step /app/dist/* /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

docker-compose.yml:

version: '3'
services:
  mysql:
    image: mysql:5.5
    network_mode: host
    container_name: mysql-container
    ports:
      - 3306:3306  
    environment:
     MYSQL_ROOT_PASSWORD: password
     MYSQL_DATABASE: Test
     MYSQL_USER: root
     MYSQL_PASSWORD: password
  mongo:
    image: mongo:3.6
    network_mode: host
    container_name: mongo-container
    ports:
      - 27017:27017 
  eurekaservice:
    image:  service1: eurekaservice
    container_name: eureka-container
    build: netflix-eureka-naming-server/ 
    restart: always
    ports:
      - 8761:8761      
    healthcheck:
      test: "exit 0"
  zuulservice:
    image:  service2: zuuluservice
    container_name: zuuluservice-container
    build: netflix-zuul-api-gateway-server/
    restart: always
    network_mode: host
    ports:
      - 8765:8765
    healthcheck:
      test: "exit 0"
  rabbitmq:
    image: rabbitmq:3-management
    hostname: rabbit
    container_name: rabbitmq-container
    ports:
      - 5672:5672
      - 15672:15672 
  accountmanagerservice:
    image: serviceAuth: accountmanagerservice
    build: accountmanager/
    restart: always
    network_mode: host
    container_name: accountmanagerservice-container
    ports: 
      - 9200:9200
    depends_on:
      - mysql
      - eurekaservice 
  bookmarkservice:
    image: servicebookmark: bookmarkservice
    restart: always
    network_mode: host
    container_name: bookmarkservice-container 
    ports:
      - 6078:6078
    depends_on:
      - mongo
      - eurekaservice
      - rabbitmq 
  recommendationservice:
    image: servicerecommended:recommendationservice
    build: recommendersystem/
    restart: always
    network_mode: host
    container_name: recommendationService-container
    ports:
      - 6082:6082
    depends_on:
      - mongo
      - eurekaservice
      - rabbitmq
  appui:
    image:  appuiservice: appui
    container_name: angular-container
    ports:
      - 80:80 

截图:

【问题讨论】:

【参考方案1】:

您的问题是您的 angular/nginx 容器。 nginx 正在寻找仪表板文件名。 docker 中的默认 nginx 配置不会将非静态 (css/js) 的 url 指向您的单个 index.html

将此 conf 文件添加到您的 nginx 容器中

worker_processes 1;
events  worker_connections 1024; 

http 

    include /etc/nginx/mime.types;

    sendfile on;

    gzip              on;
    gzip_http_version 1.0;
    gzip_proxied      any;
    gzip_min_length   500;
    gzip_disable      "MSIE [1-6]\.";
    gzip_types        text/plain text/xml text/css
                      text/comma-separated-values
                      text/javascript
                      application/x-javascript
                      application/atom+xml;

    server 
        listen 80 default_server;
        listen [::]:80 default_server;

        root /usr/share/nginx/html;

        index index.html;

        server_name _;

        location / 
            try_files $uri $uri/ /index.html; // any non static goes here
        

        location ~* \.(?:ico|css|js|gif|jpe?g|png)$ 
            # Some basic cache-control for static files to be sent to the browser
            expires max;
            add_header Pragma public;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        

    

在您的第一个副本下的dockerfile 中添加这一行

COPY nginx.conf /etc/nginx/nginx.conf

【讨论】:

我有一个疑问。实际上我还没有在我的机器上手动安装 nginx。我已经对其进行了对接。那么我怎么能添加 nginx.conf 文件,因为它是 dockerized。 @stumbler 将此行 COPY nginx.conf /etc/nginx/nginx.conf 添加到您的 dockerfile 并将 nginx.conf 放在您的主 angular 目录中。这会将nginx.conf 添加到您的 nginx 容器中。您正在将 localhost 移植到 docker 主机 80:80,因此不需要任何 nginx 本地安装 一旦你加载你的 localhost Angular 就会使用 Angular 路由器重定向到仪表板 url。在您重新加载之前,这很好。您的 nginx docker 容器不知道所有请求(css/js 除外)都需要转到 angular index.html 文件。您需要设置 nginx docker 容器以将所有请求指向非静态的 index.html 文件。 try_files $uri $uri/ /index.html; 此行查看文件是否为静态文件,如果是则返回文件 (css,js),如果不是则指向 index.html 文件。 Angular 会知道指向哪条路径 感谢@Varcorb 的回答。我会检查并通知你。 我在我的角度应用程序的主目录中添加了 nginx.conf 文件,还添加了 COPY nginx.conf /etc/nginx/nginx.conf ,然后对角度应用程序进行了对接。当我运行 docker compose 时,我在日志中收到以下错误:2019/11/22 04:21:59 [emerg] 1#1: unexpected "" in /etc/nginx/nginx.conf:33 nginx: [emerg] /etc/nginx/nginx.conf:33 2019/11/22 04:22:29 中的意外“” [emerg] 1#1:/etc/nginx/nginx.conf:33 中的意外“” nginx:[emerg] /etc/nginx/nginx.conf:33 中的意外“”

以上是关于将应用程序 URL 从一个选项卡复制到另一个选项卡导致 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

将数据从一个选项卡控制器快速传递到另一个选项卡控制器

将数据从一个设计选项卡传递到另一个选项卡

如何将动态生成的URL重定向到另一个选项卡?

将 UIView 从一个选项卡移动到另一个选项卡

在特定条件下将数据从一个选项卡自动填充到另一个选项卡

当我从一个选项卡单击到另一个选项卡时,如何使TabLayout中的选项卡不可滚动