Cors (?) - Symfony \ Component \ HttpKernel \ Exception\notFoundHttpException [дубликат]

У меня была та же проблема. Когда я запускал код на другом компьютере, он работал нормально. На моем, однако, он отобразил «Приложение может делать слишком много работы над своим основным потоком».

Я решил проблему, перезапустив студию Android [File -> Invalidated caches / Restart -> нажмите «Invalidate and Restart»].

19
задан suncoastkid 14 January 2016 в 02:07
поделиться

6 ответов

Ясно, что это не идеальное решение, но оно РАБОТАЕТ. Я добавил это в начало моего файла route.php:

header('Access-Control-Allow-Origin: *');
header( 'Access-Control-Allow-Headers: Authorization, Content-Type' );

Было бы неплохо получить эту работу без взлома ... alas.

UPDATE: Оказалось, что это связано с ИИС. Я закончил настройку заголовков в файле web.config, и теперь CORS работает без взлома файла route.php.

<httpProtocol>
    <customHeaders>
       <add name="Access-Control-Allow-Headers" value="Origin, Authorization, X-Requested-With, Content-Type, Accept" />
       <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,PUT,DELETE" />
    </customHeaders>
</httpProtocol>

Если вы хотите ограничить доступ, вы можете добавить исходящие правила:

      <outboundRules>
          <clear />
                <rule name="AddCrossDomainHeader">
                    <match serverVariable="RESPONSE_Access_Control_Allow_Origin" pattern=".*" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
                        <add input="{HTTP_ORIGIN}" pattern="(http(s)?://((.+\.)?somesite\.com|(.+\.)?anothersite\.org))" />
                    </conditions>
                    <action type="Rewrite" value="{C:0}" />
                </rule>
      </outboundRules>
18
ответ дан suncoastkid 18 August 2018 в 18:55
поделиться
  • 1
    Разве это не позволяет кому-либо делать запросы к нашему API без проверки подлинности? – plushyObject 20 September 2016 в 18:23
  • 2
    @plushyObject Я только что обновил свой ответ, чтобы решить вашу проблему. – suncoastkid 22 September 2016 в 16:39
  • 3
    где именно вы помещаете их в свой web.config? Я помещаю их после & lt; system.webServer & gt; но это не сработает. Также я не использую IIS, я использую docker / nginx, я все еще должен это делать? – Hirad Roshandel 5 April 2017 в 16:07

Проблема возникает из предпродажного запроса, действительно, но способ обработки требует некоторого дополнительного объяснения, когда мы говорим о Laravel - в основном запрос OPTIONS маршрутизируется (что-то другое скорее напоминает PHP-путь, чем Laravel путь), поэтому для этого вам нужно добавить это к вашим маршрутам:

Route::options('/{any}', function(){ return ''; })->where('any', '.*');

Теперь давайте рассмотрим все другие методы - создаем промежуточное ПО CORS:

namespace App\Http\Middleware;

use Closure;

class Cors
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request)
            ->header('Access-Control-Allow-Origin', '*')
            ->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE');
    }
}

И, наконец, для данного маршрута используйте это промежуточное ПО:

Route::put('/test', function(){ echo('test'); })->with('cors');

3
ответ дан eithed 18 August 2018 в 18:55
поделиться
  • 1
    Таким образом, он называется «предпродажным запросом». :) Благодаря – marlo 18 September 2017 в 08:20

Этот ответ основан на этой статье . barryvdh / laravel-cors библиотека промежуточного программного обеспечения может быть использована для устранения проблемы (совместное использование ресурсов Cross-Origin).

Шаг 1 Установите его:

composer require barryvdh/laravel-cors

Шаг 2 Освобождение файлов поставщика библиотеки:

php artisan vendor:publish --provider="Barryvdh\Cors\ServiceProvider"

Шаг 3 Команда, выполняемая на шаге 2, скопирует файл cors.php в каталог конфигурации, который выглядит следующим образом:

return [

/*
|--------------------------------------------------------------------------
| Laravel CORS
|--------------------------------------------------------------------------
|
| allowedOrigins, allowedHeaders and allowedMethods can be set to array('*')
| to accept any value.
|
*/

'supportsCredentials' => false,
'allowedOrigins' => ['*'],// ex: ['abc.com', 'api.abc.com']
'allowedHeaders' => ['*'],
'allowedMethods' => ['*'],// ex: ['GET', 'POST', 'PUT', 'DELETE']
'exposedHeaders' => [],
'maxAge' => 0,

];

Для параметра allowedOrigins значение может быть ['*'], которое указывает, что источник запроса может быть из любого домена или массив конкретных доменов, которые могут быть источником, который мы позволит отправить запрос на наш api, например ['first.com', 'second.com', 'register.third.com']

, а также allowedMethods может быть либо ['*'], либо список допустимых HTTP verbs, например ['POST', 'GET']

шаг 4 Регистрация промежуточного программного обеспечения cors. Откройте app/Http/kernel.php и добавьте класс HandleCors к $routeMiddleware следующим образом:

protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'cors' => \Barryvdh\Cors\HandleCors::class, // add this line to enable cors to your routes
];

Шаг 5 Теперь вы можете добавить промежуточное программное обеспечение laravel-cors на любой желаемый маршрут. Например, в Routes/api.php я сделаю это:

Route::apiResource('category', 'CategoryController')->middleware('cors');
Route::apiResource('product', 'ProductController')->middleware('cors');
0
ответ дан gandalf 18 August 2018 в 18:55
поделиться

Я решаю мою проблему, просто добавляя эту строку на мои маршруты.php Laravel 5.2. Больше, чем 5.2 в маршрутах / web.php

header('Access-Control-Allow-Origin:  *');
header('Access-Control-Allow-Methods:  POST, GET, OPTIONS, PUT, DELETE');
header('Access-Control-Allow-Headers:  Content-Type, X-Auth-Token, Origin, Authorization');

ИЛИ зарегистрировать промежуточное ПО Cors в глобальном стеке промежуточного ПО HTTP

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \App\Http\Middleware\CorsMiddleware::class
];
11
ответ дан M Arfan 18 August 2018 в 18:55
поделиться
  • 1
    полезно для некоторых случаев .. но тесты не сработают. и не лучший выбор, все еще +1 – tam5 1 November 2016 в 22:59
  • 2
    @ tam5 да тесты терпят неудачу. Любое предложение, как исправить это правильно? – Hirad Roshandel 5 April 2017 в 20:37
  • 3
    @HiradRoshandel Я думаю, что я сделал это, чтобы обернуть заголовки в промежуточное программное обеспечение, а затем запустить тесты без него, но я точно не помню, я могу вернуться к вам позже, когда у меня есть время, чтобы найти что я сделал – tam5 5 April 2017 в 20:42
  • 4
    @ tam5 ах я вижу! Я попробовал ответ Utwo, и он исправил проблему – Hirad Roshandel 5 April 2017 в 20:49
  • 5
    Рад, что это сработало, удачи – tam5 5 April 2017 в 21:00

Вы можете обойти это без использования какого-либо промежуточного программного обеспечения, такого как Barryvdh \ Cors for Laravel, который не работал должным образом с JWT AUTH, я добавил следующие инструкции в index.php в Laravel непосредственно перед экземпляром ядра

header('Access-Control-Allow-Origin: http://localhost:8001');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token,Authorization');
header('Access-Control-Allow-Credentials: true');

добавьте это до

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

, это также должно работать с JWT AUTH. Обратите внимание, что в Access-Control-Allow-Headers вы должны включить авторизацию, иначе ваш accesstoken не будет разрешен в заголовке авторизации, поэтому JWT AUTH не удастся. Happy Coding.

2
ответ дан SOUMYA 18 August 2018 в 18:55
поделиться
  • 1
    Благодарю. Это сработало. Я добавил эти строки в начало index.php – Anurag Patbandha 26 October 2017 в 10:29

Ваше промежуточное программное обеспечение в порядке, но вам нужно зарегистрировать промежуточное ПО Cors в глобальном стеке промежуточного программного обеспечения HTTP.

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \App\Http\Middleware\CorsMiddleware::class
];
5
ответ дан Utwo 18 August 2018 в 18:55
поделиться
  • 1
    благодаря! вы спасли меня – Hirad Roshandel 5 April 2017 в 20:41
  • 2
    пока я не добавил его в глобальное пространство промежуточного программного обеспечения, это не сработало. Спасибо, что спасли меня – Jimmy Ilenloa 2 May 2017 в 08:36
Другие вопросы по тегам:

Похожие вопросы: