我有两个容器,一个用于前端应用程序(用Sveltekit构建),另一个用于后端应用程序(Laravel,Nginx,MySQL)。
我试图从前端访问我的后端应用程序,但是我得到了以下错误:
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配置:
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
文件:
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
文件:
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客户端,而不是从我的前端应用程序?
谢谢
发布于 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
头。代码应该如下所示:
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发出请求。
https://stackoverflow.com/questions/74680388
复制相似问题