«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Способы решения проблем CORS

Способы решения проблем CORS

Опубликовано 7 ноября 2024 г.
Просматривать:386

Ways to resolve CORS issues

Чтобы решить проблемы CORS, вам необходимо добавить соответствующие заголовки либо на веб-сервере (например, Apache или Nginx), либо в серверной части (например, Django, Go или Node.js). или во внешних средах (например, React или Next.js). Ниже приведены шаги для каждой платформы:

1. Веб-серверы

Апач

Вы можете настроить заголовки CORS в файлах конфигурации Apache (таких как .htaccess, httpd.conf или apache2.conf) или в конкретной конфигурации виртуального хоста.

Добавьте следующие строки, чтобы включить CORS:


    Header set Access-Control-Allow-Origin "*"
    Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
    Header set Access-Control-Allow-Headers "Content-Type, Authorization"

  • Чтобы применить CORS для определенных доменов:
  Header set Access-Control-Allow-Origin "https://example.com"
  • Если требуются учетные данные:
  Header set Access-Control-Allow-Credentials "true"

Убедитесь, что модуль mod_headers включен. Если нет, включите его, используя:

sudo a2enmod headers
sudo systemctl restart apache2

Нгинкс

В Nginx вы можете настроить заголовки CORS в nginx.conf или в определенном блоке сервера.

Добавьте следующие строки:

server {
    location / {
        add_header Access-Control-Allow-Origin "*";
        add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
        add_header Access-Control-Allow-Headers "Content-Type, Authorization";
    }

    # Optional: Add for handling preflight OPTIONS requests
    if ($request_method = OPTIONS) {
        add_header Access-Control-Allow-Origin "*";
        add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE";
        add_header Access-Control-Allow-Headers "Authorization, Content-Type";
        return 204;
    }
}
  • Если требуются учетные данные:
  add_header Access-Control-Allow-Credentials "true";

Затем перезапустите Nginx:

sudo systemctl restart nginx

2. Бэкенд-фреймворки

Джанго

В Django вы можете добавлять заголовки CORS с помощью пакета django-cors-headers.

  1. Установите пакет:
   pip install django-cors-headers
  1. Добавьте «corsheaders» в INSTALLED_APPS в файле settings.py:
   INSTALLED_APPS = [
       ...
       'corsheaders',
   ]
  1. Добавьте промежуточное программное обеспечение CORS в свое MIDDLEWARE:
   MIDDLEWARE = [
       'corsheaders.middleware.CorsMiddleware',
       'django.middleware.common.CommonMiddleware',
       ...
   ]
  1. Установите разрешенные источники в settings.py:
   CORS_ALLOWED_ORIGINS = [
       "https://example.com",
   ]
  • Чтобы разрешить все источники:
  CORS_ALLOW_ALL_ORIGINS = True
  • Если требуются учетные данные:
  CORS_ALLOW_CREDENTIALS = True
  • Чтобы разрешить определенные заголовки или методы:
  CORS_ALLOW_HEADERS = ['Authorization', 'Content-Type']
  CORS_ALLOW_METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']

Go (Голанг)

В Go вы можете обрабатывать CORS вручную в обработчике HTTP или использовать промежуточное программное обеспечение, такое как rs/cors.

Использование промежуточного программного обеспечения rs/cors:

  1. Установите пакет:
   go get github.com/rs/cors
  1. Используйте его в своем приложении:
   package main

   import (
       "net/http"
       "github.com/rs/cors"
   )

   func main() {
       mux := http.NewServeMux()

       // Example handler
       mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
           w.Write([]byte("Hello, World!"))
       })

       // CORS middleware
       handler := cors.New(cors.Options{
           AllowedOrigins:   []string{"https://example.com"}, // Or use * for all
           AllowedMethods:   []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
           AllowedHeaders:   []string{"Authorization", "Content-Type"},
           AllowCredentials: true,
       }).Handler(mux)

       http.ListenAndServe(":8080", handler)
   }

Node.js (Express)

В Express (Node.js) вы можете использовать промежуточное программное обеспечение cors.

  1. Установите пакет cors:
   npm install cors
  1. Добавьте промежуточное ПО в приложение Express:
   const express = require('express');
   const cors = require('cors');
   const app = express();

   // Enable CORS for all routes
   app.use(cors());

   // To allow specific origins
   app.use(cors({
       origin: 'https://example.com',
       methods: ['GET', 'POST', 'PUT', 'DELETE'],
       allowedHeaders: ['Authorization', 'Content-Type'],
       credentials: true
   }));

   // Example route
   app.get('/', (req, res) => {
       res.send('Hello World');
   });

   app.listen(3000, () => {
       console.log('Server running on port 3000');
   });

3. Frontend Framework

Реагировать

В React CORS обрабатывается серверной частью, но во время разработки вы можете проксировать запросы API, чтобы избежать проблем с CORS.

  1. Добавьте прокси в package.json:
   {
     "proxy": "http://localhost:5000"
   }

Это будет проксировать запросы во время разработки на ваш внутренний сервер, работающий на порту 5000.

Для производства серверная часть должна обрабатывать CORS. При необходимости используйте такой инструмент, как http-proxy-middleware, для большего контроля.

Next.js

В Next.js вы можете настроить CORS в маршрутах API.

  1. Создайте собственное промежуточное ПО для маршрутов API:
   export default function handler(req, res) {
       res.setHeader('Access-Control-Allow-Origin', '*'); // Allow all origins
       res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
       res.setHeader('Access-Control-Allow-Headers', 'Authorization, Content-Type');

       if (req.method === 'OPTIONS') {
           // Handle preflight request
           res.status(200).end();
           return;
       }

       // Handle the actual request
       res.status(200).json({ message: 'Hello from Next.js' });
   }
  1. В next.config.js вы также можете изменять заголовки ответов:
   module.exports = {
       async headers() {
           return [
               {
                   source: '/(.*)', // Apply to all routes
                   headers: [
                       {
                           key: 'Access-Control-Allow-Origin',
                           value: '*', // Allow all origins
                       },
                       {
                           key: 'Access-Control-Allow-Methods',
                           value: 'GET, POST, PUT, DELETE, OPTIONS',
                       },
                       {
                           key: 'Access-Control-Allow-Headers',
                           value: 'Authorization, Content-Type',
                       },
                   ],
               },
           ];
       },
   };

Краткое описание того, куда добавлять заголовки:

  • Веб-серверы (Apache, Nginx): настройте в файлах конфигурации сервера (например, .htaccess, nginx.conf).
  • Бэкенд-фреймворки:
    • Django: используйте заголовки django-cors.
    • Go: добавьте заголовки вручную или используйте промежуточное программное обеспечение, например rs/cors.
    • Node.js (Express): используйте промежуточное программное обеспечение cors.
  • Фронтенд: при разработке используйте настройки прокси-сервера (например, прокси-сервер React или пользовательские заголовки Next.js), чтобы избежать проблем с CORS, но всегда обрабатывайте CORS на бэкэнде в рабочей среде.
Заявление о выпуске Эта статья переиздана по адресу: https://dev.to/tikam02/ways-to-resolve-cors-issues-15on?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected], чтобы удалить его.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3