首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Docker应用程序请求被CORS阻止到另一个容器

Docker应用程序请求被CORS阻止到另一个容器
EN

Stack Overflow用户
提问于 2022-12-04 19:55:36
回答 1查看 12关注 0票数 0

我有两个容器,一个用于前端应用程序(用Sveltekit构建),另一个用于后端应用程序(Laravel,Nginx,MySQL)。

我试图从前端访问我的后端应用程序,但是我得到了以下错误:

代码语言:javascript
运行
复制
Access to XMLHttpRequest at 'http://127.0.0.1:8000/api/auth/login' from origin 
'http://localhost:8080' has been blocked by CORS policy: Response to preflight request 
doesn't pass access control check: The 'Access-Control-Allow-Origin' header contains 
multiple values '*, *', but only one is allowed.

xhr.js:220          POST http://127.0.0.1:8000/api/auth/login net::ERR_FAILED

奇怪的是,我可以从REST客户端访问API,这意味着我的后端应用程序可以从容器外部访问。

下面是我的Nginx配置:

代码语言:javascript
运行
复制
server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

下面是我后端的docker-compose文件:

代码语言:javascript
运行
复制
version: "3.9"
services:
  app:
    build:
      context: ./
      dockerfile: Dockerfile
    image: dmc
    container_name: dmc-app
    restart: unless-stopped
    working_dir: /var/www/
    depends_on:
      - db
      - nginx
    volumes:
      - ./:/var/www/
      - ./docker/php/conf.d/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
      - ./docker/php/conf.d/error_reporting.ini:/usr/local/etc/php/conf.d/error_reporting.ini
    expose:
      - "9003"
    networks:
      - dmc-net

  nginx:
    image: nginx:1.23.2-alpine
    container_name: dmc-nginx
    restart: unless-stopped
#    environment:
#      PHP_IDE_CONFIG: "serverName=dmc-server"
    ports:
      - "8000:80"
    volumes:
      - ./:/var/www
      - ./docker-compose/nginx:/etc/nginx/conf.d
    networks:
      - dmc-net

  db:
    image: mysql:8.0.31
    container_name: dmc-db
    restart: unless-stopped
    # using 3307 on the host machine to avoid collisions in case there's a local MySQL instance installed already.
    ports:
      - "3307:3306"
    # use the variables declared in .env file
    environment:
      MYSQL_HOST: ${DB_HOST}
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: abcd1234
      MYSQL_USER: ${DB_USERNAME}
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - ./docker-compose/mysql:/docker-entrypoint-initdb.d
      - mysql-data:/var/lib/mysql
    networks:
      - dmc-net

networks:
  dmc-net:
    driver: bridge

volumes:
  mysql-data:

这是我的前端的docker-compose文件:

代码语言:javascript
运行
复制
version: "3.9"

services:
  dmc-web:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: dmc-web
    restart: always
    ports:
      - "3000:3000"
      - "3010:3010"
      - "8080:8080"
      - "5050:5050"
      - "24678:24678"
    volumes:
      - ./:/var/www/html

我遗漏了什么?为什么我可以访问我的后端从我的REST客户端,而不是从我的前端应用程序?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-12-04 21:23:28

看起来问题就在于后端应用程序响应中的Access-Control-Allow-Origin头。此标头指定允许哪些域向API发出请求。错误消息指出,标头包含多个值(*, *),但只允许一个值。

要解决这个问题,您需要在后端应用程序的响应中更新Access-Control-Allow-Origin头,以便只包括您的前端应用程序正在运行的域(例如http://localhost:8080)。这将允许您的前端应用程序的请求被您的后端应用程序接受。

在您的Laravel应用程序中,您可以在Access-Control-Allow-Origin文件中设置app/Http/Middleware/Cors.php头。代码应该如下所示:

代码语言:javascript
运行
复制
public function handle($request, Closure $next)
{
    return $next($request)
        ->header('Access-Control-Allow-Origin', 'http://localhost:8080')
        ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
}

确保更新Access-Control-Allow-Origin头的值以匹配您的前端应用程序的域。您还可能需要更新Access-Control-Allow-Methods头,以包含您的API支持的任何其他HTTP方法。

在进行此更改后,请确保重新启动后端应用程序以使更改生效。这将解决CORS策略错误,并允许前端应用程序向后端API发出请求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74680388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档