Каким образом можно устранить проблему CORS в Swagger?

Я создал файл docker-compose, который описывает три сервиса: базу данных Postgres, сервер и Nginx. Вот его содержимое: 

```yaml
services:
  db:
    container_name: db
    restart: always
    image: postgres:17
    env_file: ./.env
    expose:
      - "5432"
    volumes:
      - local_postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}" ]
      interval: 10s
      retries: 5
      start_period: 30s
      timeout: 10s
  server:
    container_name: server
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    env_file: ./.env
    expose:
      - "8080"
    depends_on:
      db:
        condition: service_healthy
  nginx:
    image: nginx:latest
    container_name: nginx
    build:
      context: .
      dockerfile: Dockerfile_nginx
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - server
```

Кроме того, вот код файла nginx.conf, который я использую для простого обратного прокси:

```nginx
events {
    worker_connections 1024;
}

http {
    server {
        listen 80;

        location / {
            proxy_pass http://server:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}
```

При запуске сервера я использую хост `0.0.0.0`, чтобы Nginx в Docker мог получить доступ к сервису `server` в одной сети Docker. После запуска этого docker-compose всё функционирует корректно, и все GET и POST запросы обрабатываются через браузер и Postman. Однако, у меня возникла проблема с библиотекой Swagger на Go (ссылка на источник: <a href="http
  • 28 ноября 2024 г. 11:33
Ответы на вопрос 1
Чтобы устранить проблему CORS (Cross-Origin Resource Sharing) при использовании Swagger с Nginx и Go-сервером, вам нужно будет убедиться, что ваш сервер правильно обрабатывает заголовки CORS, а также скорректировать настройки Nginx.

1. **Внедрение заголовков CORS на сервере**:

   В вашем Go-коде при обработке HTTP-запросов необходимо устанавливать заголовки CORS. Обычно это делается в middleware. Пример простого middleware в Go:

   ```go
   package main

   import (
       "net/http"
   )

   func enableCORS(next http.Handler) http.Handler {
       return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
           w.Header().Set("Access-Control-Allow-Origin", "*") // или укажите домен
           w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
           w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
           if r.Method == http.MethodOptions {
               w.WriteHeader(http.StatusOK)
               return
           }
           next.ServeHTTP(w, r)
       })
   }
   ```

   Затем оберните ваши маршруты в этот middleware:

   ```go
   http.Handle("/", enableCORS(http.HandlerFunc(yourHandler)))
   ```

2. **Настройка Nginx**:

   Вам также следует убедиться, что Nginx правильно передает CORS заголовки. Чтобы сделать это, вы можете добавить следующие директивы в ваш `nginx.conf`:

   ```nginx
   server {
       listen 80;

       location / {
           proxy_pass http://server:8080;
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           
           # Задаем заголовки CORS
           add_header 'Access-Control-Allow-Origin' '*'; # или укажите домен
           add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
           add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
           
           # Если запрос OPTIONS, возвращаем 204
           if ($request_method = OPTIONS) {
               add_header 'Access-Control-Allow-Origin' '*';
               add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
               add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
               add_header 'Content-Length' 0;
               return 204;
           }
       }
   }
   ```

Эти изменения позволят вашему приложению обрабатывать CORS запросы и позволят из Swagger отправлять запросы к вашему API.

После внесения изменений не забудьте перезапустить Nginx и ваш Go-сервер, чтобы применить новые настройки.
Похожие вопросы