Laravel 5:仅在一个 URL 上路由 CORS 问题

     2023-03-04     114

关键词:

【中文标题】Laravel 5:仅在一个 URL 上路由 CORS 问题【英文标题】:Laravel 5: routing CORS issue on just one URL 【发布时间】:2020-01-08 12:23:43 【问题描述】:

我正在尝试向外部 laravel 站点发出 2 个 ajax 请求。其中一个请求完美运行(“列表”)。另一个(“savedevice”)给我以下错误:

CORS 策略已阻止从源“null”访问“http://localhost/somesite/devicecreate”处的 XMLHttpRequest:请求的资源上不存在“Access-Control-Allow-Origin”标头。

origin 为 null,因为请求来自本地 html。

我已经创建了一个适用于第一个路由但不适用于第二个路由的 CORS 中间件解决方案。

2个路由在web.php中存储如下:

  Route::post('/devicecreate','FrontEndController@savedevice')->middleware('cors');
  Route::post('/list', 'FrontEndController@list')->middleware('cors');

这是我在 javascript 中的 ajax 请求函数

var ajaxRequest = function ( url, data, callback ) 

        var  xhr = new XMLHttpRequest();

        xhr.onerror = function(e)  
              console.log("Ajax request error");
        ;

        xhr.addEventListener("load",function () 
              xhr.responseJSON = JSON.parse( xhr.responseText );
              callback( xhr.responseJSON);
        );

        xhr.open("POST", url );
        xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
        xhr.send(data);
;

目前(出于测试目的)两种路由方法都做同样的事情。但只有“/list”有效。

如果我尝试 php artisan route:list 我可以看到“devicecreate”和“list”都具有相同的方法、正确的操作和相同的中间件

我的 CORS 中间件如下所示:

<?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)
     

         if ($request->getMethod() == "OPTIONS") 
             return response(['OK'], 200)
             ->withHeaders([
            'Access-Control-Allow-Origin' => '*',
            'Access-Control-Allow-Methods' => 'GET,POST',
            'Access-Control-Allow-Headers' => 'Authorization,Content-Type,X-Requested-With,XMLHttpRequest',
          ]);
    

    return $next($request)
    ->header('Access-Control-Allow-Origin', '*')
    ->header('Access-Control-Allow-Methods', 'GET,POST')
    ->header('Access-Control-Allow-Headers','Authorization,Content-Type,X-Requested-With,XMLHttpRequest');

      
  

我也尝试运行 php artisan route:cache

我已尝试重命名路线,但没有任何区别。

谁能帮忙?

【问题讨论】:

【参考方案1】:

24 小时后,我为遇到以下任何情况的任何人提供了解决方案:

CORS / 跨域错误从外部来源发布 ajax(否则预检) 419 状态未知 从外部网站发布时围绕 CSRF 令牌的问题。

1) 创建一个 CORS 中间件 (https://laravel.com/docs/5.8/middleware)。您可以使用我上面显示的中间件代码。

2) 确保将中间件添加到受保护的 $routeMiddleware 下的 Http/Kernal.php 文件中,例如: 'cors' =&gt; \App\Http\Middleware\Cors::class,

3) 仅将中间件附加到需要它的路由上。就我而言,这是:

Route::post('/setdevice','FrontEndController@savedevice')->middleware('cors');
Route::post('/list', 'FrontEndController@list')->middleware('cors');

4) 记住要从 CSRF 令牌验证中排除您的外部 Ajax 请求! 我的问题是我忘记添加第二条路由了!所以就我而言,我将这些添加到 Http/Middleware/VerifyCsrfToken.php 中受保护的 $except 参数中:

 protected $except = [
        'list',
        'savedevice',
    ];

【讨论】:

仅在 Laravel 5 中为一个环境启用全局中间件

】仅在Laravel5中为一个环境启用全局中间件【英文标题】:EnableglobalmiddlewareonlyforoneenvironmentinLaravel5【发布时间】:2015-04-1117:35:59【问题描述】:我在Laravel5(barryvdh/laravel-cors)中使用了一个全局中间件,但我只希望它在一个环境(dev... 查看详情

仅在 Laravel 中公开某些身份验证路由

】仅在Laravel中公开某些身份验证路由【英文标题】:OnlyexposingcertainauthroutesinLaravel【发布时间】:2016-11-1308:42:28【问题描述】:在Laravel5.2中,身份验证变得非常简单,它使身份验证更简单的方法之一是通过一种方法添加身份验... 查看详情

在 Laravel 路由上设置协议

】在Laravel路由上设置协议【英文标题】:SettheprotocolonaLaravelroute【发布时间】:2016-10-0922:43:59【问题描述】:我在网站上有一条通往webcal资源的路由,因此我们希望在Blade模板中使用URL::route(\'calendar\')时使用webcal://生成URL。我尝... 查看详情

Laravel:MethodNotAllowedHttpException 仅在生产服务器上

】Laravel:MethodNotAllowedHttpException仅在生产服务器上【英文标题】:Laravel:MethodNotAllowedHttpExceptiononlyonproductionserver【发布时间】:2018-07-3019:09:20【问题描述】:我已经阅读了laravelthrowingMethodNotAllowedHttpException,并且我知道在发布到GE... 查看详情

在 Laravel 5.3 的中间件中访问路由 URL 参数

】在Laravel5.3的中间件中访问路由URL参数【英文标题】:AccessingRouteURLParameterinMiddlewareinLaravel5.3【发布时间】:2017-03-0614:27:09【问题描述】:从Laravel5.1更新到Laravel5.3后,我很难访问中间件中的路由URL参数。这是我的路线文件:Rout... 查看详情

Laravel 5.4:发布没有表单或隐藏 url 的路由

】Laravel5.4:发布没有表单或隐藏url的路由【英文标题】:Laravel5.4:postroutewithoutaformortohidetheurl【发布时间】:2018-08-2012:27:03【问题描述】:我在routes/web.php中有以下routeRoute::get(\'search/model/lang/id\',[\'as\'=>\'tag\',\'uses\'=>\'SearchCont... 查看详情

在 Ajax 调用中传递完整 URL 作为参数 - Laravel 5.1 路由

】在Ajax调用中传递完整URL作为参数-Laravel5.1路由【英文标题】:PassingfullURLasparameterinAjaxcall-Laravel5.1routing【发布时间】:2015-08-2110:34:41【问题描述】:编辑:我想我应该添加Laravel5.1件!Ajax调用由如下路由处理:Route::get(\'ajax/actio... 查看详情

laravel 仅在分页中显示下一个和上一个链接

】laravel仅在分页中显示下一个和上一个链接【英文标题】:laravelshowonlynextandpreviouslinkinpagination【发布时间】:2014-11-2617:21:37【问题描述】:我正在尝试使用Laravel分页,我只想显示没有数字123的上一个和下一个链接...我怎么能这... 查看详情

React 路由器更改 url 但不更改视图(仅在 Internet Explorer 11 上)

】React路由器更改url但不更改视图(仅在InternetExplorer11上)【英文标题】:Reactrouterchangesurlbutnottheview(onlyonInternetExplorer11)【发布时间】:2017-12-1512:59:05【问题描述】:在Chrome和Firefox中基本上一切正常,但在IE上单击链接元素后只... 查看详情

Laravel 5 - 发布路由上的 htaccess HTTPS 重定向不起作用。

】Laravel5-发布路由上的htaccessHTTPS重定向不起作用。【英文标题】:Laravel5-htaccessHTTPSredirectonpostroutesdoesn\'twork.【发布时间】:2016-05-2518:12:30【问题描述】:我有一个使用Laravel5作为API构建的应用程序。我的.htaccess文件中有以下内... 查看详情

Laravel 5 子文件夹路由

】Laravel5子文件夹路由【英文标题】:Laravel5RoutingforSubfolders【发布时间】:2015-05-1402:10:26【问题描述】:我是Laravel5的新手。我只想要一个按钮来重定向到子文件夹中的页面。这是我的按钮代码...<ahref="URL::to(\'members.Register\')"cl... 查看详情

Laravel 5.0.* 中间件在处理路由之前从 url 中删除前缀语言环境

】Laravel5.0.*中间件在处理路由之前从url中删除前缀语言环境【英文标题】:Laravel5.0.*middlewaretoremoveprefixlocalefromurlbeforeroutesareprocessed【发布时间】:2016-04-2406:38:26【问题描述】:我正在寻找一种方法,使所有应用程序路由具有多... 查看详情

找不到路线返回页面 Laravel 5.3

】找不到路线返回页面Laravel5.3【英文标题】:RoutereturnpagenotfoundLaravel5.3【发布时间】:2017-04-2916:35:17【问题描述】:我是框架Laravel的初学者,我正在使用Laravel5.3-我创建了一个新项目-laravel-。-它在URL"http://localhost/laravel/public/"上... 查看详情

Angular 4 和 Laravel 5.4 的刷新路由问题

】Angular4和Laravel5.4的刷新路由问题【英文标题】:On-RefreshroutingissuewithAngular4andLaravel5.4【发布时间】:2018-07-2600:55:42【问题描述】:我用Angular4和Laravel5.4创建了一个简单的应用程序来进行CRUD操作。所以,基本上我有一个在localhost... 查看详情

用 Laravel 路由上的 URL 上的对象名称替换对象 ID

】用Laravel路由上的URL上的对象名称替换对象ID【英文标题】:ReplacingobjectIDbyobjectnameonURLonLaravelroute【发布时间】:2019-09-0822:06:57【问题描述】:我试图在我的Laravel应用程序上使我的URL对SEO更友好,方法是在转到该特定注册显示... 查看详情

Laravel 5.1 UrlGenerator 路由未定义错误

】Laravel5.1UrlGenerator路由未定义错误【英文标题】:Laravel5.1UrlGeneratorroutenotdefinederror【发布时间】:2016-01-3005:14:17【问题描述】:我有一个使用Laravel5.1构建的应用程序。我正在使用Form::open使用route_name来生成将表单发布到的url,... 查看详情

Laravel 5.4 通过子域运行所有路由

】Laravel5.4通过子域运行所有路由【英文标题】:Laravel5.4runningallroutesthroughsubdomain【发布时间】:2018-02-2701:27:21【问题描述】:我刚刚在共享主机上使用Composer部署了Laravel5.4,我遇到了几个我认为现在已经解决的问题。第一个是... 查看详情

Laravel 重定向到一个路由,但是 apache 给出 404 错误

】Laravel重定向到一个路由,但是apache给出404错误【英文标题】:Laravelredirectstoaroutebutthenapachegives404error【发布时间】:2014-05-1013:35:28【问题描述】:我有一个网站在不同的url(staging)中的同一台服务器上运行,但现在我已经部署了... 查看详情