Поддержка CORS для localhost: 3000 в Laravel 7 - PullRequest
0 голосов
/ 07 марта 2020

Перед публикацией здесь я обязательно поищу в Интернете возможные решения этой проблемы.

Я использую Nuxt SSR для внешнего интерфейса и Laravel 7 в качестве внутреннего API, который теперь имеет собственную реализацию CORS. Мое интерфейсное приложение работает на http://localhost:3030, а API на http://gaminghub.test.

Это то, что у меня есть в cors.php, который поставляется с последней версией laravel:

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Cross-Origin Resource Sharing (CORS) Configuration
    |--------------------------------------------------------------------------
    |
    | Here you may configure your settings for cross-origin resource sharing
    | or "CORS". This determines what cross-origin operations may execute
    | in web browsers. You are free to adjust these settings as needed.
    |
    | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
    |
    */

    'paths' => ['api/*'],

    'allowed_methods' => ['*'],

    'allowed_origins' => ['*'],

    'allowed_origins_patterns' => [],

    'allowed_headers' => ['*'],

    'exposed_headers' => false,

    'max_age' => false,

    'supports_credentials' => true,

];

Используя почтальон, это то, что возвращается при отправке запроса на получение http://gaminghub.test/api/products?category=play-card:

{
    "data": [
        {
            "id": 1,
            "name": "Xiaomi",
            "price": 2000000,
            "description": "Best value for money",
            "slug": "xiaomi"
        }
    ],
    "links": {
        "first": "http://gaminghub.test/api/products?page=1",
        "last": "http://gaminghub.test/api/products?page=2",
        "prev": null,
        "next": "http://gaminghub.test/api/products?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 2,
        "path": "http://gaminghub.test/api/products",
        "per_page": 1,
        "to": 1,
        "total": 2
    }
}

nuxt.config. js включает в себя:

  /*
   ** Axios module configuration
   ** See https://axios.nuxtjs.org/options
   */
  axios: {
    baseURL: "http://gaminghub.test/api",
    credentials: true
  },

product.vue содержит следующее для извлечения данных:

<script>
export default {
    data() {
    return {
      product: null
    }
  },

  async asyncData({params, app}) {
    let res = await app.$axios.$get(`products/?category=${params.slug}`)

    return {
      product: res.data
    }
  },
}
</script>

Итак в основном, когда я нажимаю на каждую категорию, они отправляют запрос на получение api/products?category=clicked-category-slug, что приводит к следующей ошибке в консоли:

Access to XMLHttpRequest at 'http://gaminghub.test/api/products/?category=play-card' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.

Заголовок сетевого запроса содержит следующее:

Request Headers Provisional headers are shown Accept: application/json, text/plain, */* Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9nYW1pbmdodWIudGVzdFwvYXBpXC9hdXRoXC9sb2dpbiIsImlhdCI6MTU4MzU3MjQ4MiwiZXhwIjoxNTgzNTc2MDgyLCJuYmYiOjE1ODM1NzI0ODIsImp0aSI6ImdYY1Q3WGRSVnFXdUpocFIiLCJzdWIiOjMsInBydiI6Ijg3ZTBhZjFlZjlmZDE1ODEyZmRlYzk3MTUzYTE0ZTBiMDQ3NTQ2YWEifQ.t4JLsLLE6WIFZp67hbafZl8YTLlzN2WyQVw11mETMNQ Referer: http://localhost:3000/categories/play-card User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36

Ошибка исчезает, и ожидаемые данные возвращаются при перезагрузке браузера. Nuxt работает в режиме universal ssr.

Мне нужно несколько советов, чтобы понять, что может быть причиной этой проблемы. Должно быть, я что-то упускаю

1 Ответ

0 голосов
/ 07 марта 2020

Ошибка «Перенаправление не разрешено для предварительного запроса». Обычно это происходит, когда сервер отправляет клиенту заголовок ответа «Расположение». Браузеру это не нравится и поэтому выдает ошибку. Так что ваш laravel контроллер в url / api / products? Category = play-card может отправлять заголовок Location, я не уверен. Например, для устранения этой проблемы вы можете проверить заголовки, отправленные клиенту с помощью Postman, когда вы запрашиваете этот URL.

Надеюсь, это поможет вам.

PS: я начинающий, отвечая на вопросы здесь, так что это могут быть неправильные ответы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...