Docker PHP 访问控制允许来源 CORS

lit*_*ito 3 cors docker dockerfile docker-compose

我想在默认 PHP Docker 容器 ( https://hub.docker.com/_/php ) 上永久启用 CORS。docker-compose.yaml 或 docker-compose.yaml 中的配置是什么?

这是 ReactJS 使用 axios 发出的请求

  class App extends React.Component {
    ... getUsers() {

    axios.get(`http://127.0.0.1:8000/index.php/api`).then(res => {

      this.setState({ users: res.data });

      console.log(state.users);

      // this.setState({ users });

    });

  }
Run Code Online (Sandbox Code Playgroud)

错误: Access to XMLHttpRequest at 'http://127.0.0.1:8000/index.php/api' from origin 'http://127.0.0.1:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

docker-compose.yaml

version: '3.3'
services:
  web:
    build:
      context: ./php
      dockerfile: Dockerfile 
    container_name: php74
    depends_on: 
      - db
    volumes:
      - ./php:/var/www/html/
    ports: 
      - 8000:80
  db:
    container_name: mysql8
    image: mysql:latest
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_db
      MYSQL_USER: devuser
      MYSQL_PASSWORD: devpass
    ports:
      - 3306:3306
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM php:7.4-apache
RUN apt-get update && apt-get upgrade -y 
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
EXPOSE 80
Run Code Online (Sandbox Code Playgroud)

Zei*_*tor 7

您需要在镜像中的apache配置中添加相关标头。您还需要启用,mod_headers因为默认情况下您的映像中并未启用它。我使用了与php docker 映像文档中描述的类似技术(在页面上搜索“更改 DocumentRoot(或其他 Apache 配置)”)。

这是一个可能的 Dockerfile。我还添加了一些好的做法来限制运行 apt 后层的大小。

FROM php:7.4-apache

RUN apt-get update && apt-get upgrade -y \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli \
    && a2enmod headers
    && sed -ri -e 's/^([ \t]*)(<\/VirtualHost>)/\1\tHeader set Access-Control-Allow-Origin "*"\n\1\2/g' /etc/apache2/sites-available/*.conf

EXPOSE 80
Run Code Online (Sandbox Code Playgroud)

参考: