【问题标题】:Error while posting form in laravel (CORS)在 laravel (CORS) 中发布表单时出错
【发布时间】:2021-12-30 05:11:58
【问题描述】:

我已经安装了 Laravel 7.0 并使用 angular 12 作为前端。我用过这个包

https://github.com/fruitcake/laravel-cors

这是我的 kernel.php

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        
        \App\Http\Middleware\TrustProxies::class,
        \Fruitcake\Cors\HandleCors::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
       
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        
    ];
}

cors.php

<?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' => ['*'],

    'max_age' => 0,

    'supports_credentials' => true,

];

api.php

Route::group(['middleware' => ['api']], function ($router) {
    Route::post('/contact-us', [SiteController::class, 'contactUs']);
});

Route::group([
    'middleware' => ['api'],
    'prefix' => 'auth'

], function ($router) {
    Route::post('/login', [AuthController::class, 'login']);
    Route::get('/user-profile', [AuthController::class, 'Profile']);  
  
});

我收到此错误:

在“http://127.0.0.1:8000/api/auth/login”访问 XMLHttpRequest 来自原点“http://localhost:4200”已被 CORS 策略阻止: 请求中不存在“Access-Control-Allow-Origin”标头 资源。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    使用自己的 CORS 中间件进行测试

    请求的资源上不存在“Access-Control-Allow-Origin”标头。

    处理请求的网站(此处为localhost:4200)必须设置此标头以允许跨域请求。所以这个包显然没有做任何事情。
    我无法帮助使用所使用的包,但这里是如何使用您自己的中间件设置标头(可能对其他人有帮助)。根据需要更改标题。我们将使用它进行测试:

    app/Http/Middleware/Cors.php

    <?php
    
    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-Headers', 'Authorization')
          ->header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, PATCH');
      }
    }
    

    app/Http/Kernel.php 中,我们将其添加到$middleware

        protected $middleware = [
            // ...
            \App\Http\Middleware\Cors::class, 
        ];
    

    服务器现在应该设置相应的标头。
    这可能不是您的解决方案,但您至少可以调试不同之处。

    Access-Control-Allow-... 的文档:
    https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers

    【讨论】:

    • 感谢您的回答我已经实现了这个自定义中间件,但有时用户抱怨他们由于 cors 问题而无法访问站点,cors 中间件在某些情况下是否会失败,例如访问站点的位置或时间
    • 好的,当然。根据确切的请求和响应,某些请求可能仍会导致被拒绝。如果这通常有效,那么您必须调试这些具体请求。不应该直接是中间件的错。被拒绝的请求包括未正确设置正文/标题/方法的请求,因此计算机和键盘之间可能会出现很多问题。
    • 一个系统上的相同注册表正在工作,而另一个系统由于 cors 错误而失败
    • 好的,这仍然取决于具体的请求,包括标头。你有一个有效的例子,所以没有比找到不同更容易的了。对吧?
    • 谢谢,我会检查这两个请求
    猜你喜欢
    • 2022-01-23
    • 2019-10-21
    • 2016-07-25
    • 2021-03-02
    • 2015-10-07
    • 2019-12-26
    • 1970-01-01
    • 2016-07-04
    • 2020-09-21
    相关资源
    最近更新 更多