流明仅在验证后才抛出 CORS

Posted

技术标签:

【中文标题】流明仅在验证后才抛出 CORS【英文标题】:Lumen throws CORS only with validation 【发布时间】:2021-03-29 20:06:29 【问题描述】:

我已经在我的 nginx 中启用了 CORS,它似乎可以正常工作,直到我将此代码和平添加到函数存储(请求 $request):

public function store(Request $request)

       $validated = $request->validate([
            'title' => 'required|unique:posts|max:255',
            'file' => 'mimes:application/zip,application/x-rar-compressed,application/x-7z-compressed'

只要我添加 $request->validate() 我总是得到 CORS 错误: 从源“bbb.com”访问“aaa.com/upload”处的 XMLHttpRequest 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。

验证是否通过并不重要。如果我删除此验证,一切正常。

“验证”如何弄乱 NGINX 配置?

编辑: Nginx 配置:

location ~ \.php$ 
    if ($request_method = 'OPTIONS') 
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        #
        # Custom headers and headers various browsers *should* be OK with but aren't
        #
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        #
        # Tell client that this pre-flight info is valid for 20 days
        #
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
     
     if ($request_method = 'POST') 
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
     
     if ($request_method = 'GET') 
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
     
        include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;

    

【问题讨论】:

向我们展示你的 nginx 配置? 【参考方案1】:

您的响应返回错误,因此响应标头不正确,很可能是 403,而经过适当验证的响应应该是 200 或 202。

如果您使用的是 Laravel/Lumen 的 3 个最新版本,则不必担心手动设置 CORS 配置。现在内置的 Laravel-CORS 包会为您解决这个问题。

查看此链接:https://laravel.com/docs/8.x/routing#cors

按照该文档:

// $APP_FOLDER/config/cors.php
<?php


return [
    'paths' => ['api/*'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['*'],
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => true,
];

该配置应该不受限制地打开它。只需调整配置以满足您的需求。

重启你的网络服务器,它应该没问题。

【讨论】:

你在说什么样的错误?我正在使用最新的 LUMEN 并使用文档中的验证。 logs/ 目录中没有错误。那么服务器怎么会有不正确的响应呢?如果 NGINX 配置可以解决这个问题,我为什么要使用额外的包? 这太粗鲁了。无论如何,据我所知,您仍在手动处理 CORS,而不是使用内置的 CORS 包。祝你好运。 因为这不能回答我的问题。这就是为什么简单的验证会破坏 CORS。这不是一个 laravel,而是一个简单的单端点流明项目。我想了解问题,不要在不了解问题的情况下盲目使用额外的包。

以上是关于流明仅在验证后才抛出 CORS的主要内容,如果未能解决你的问题,请参考以下文章

日历验证错误仅在第二次通过 Jquery UI 选择日期后才消失

仅在客户端 JS 中检查数据后才调用 Ajax?

流明自定义验证响应

流明自定义验证

如何在流明中验证日期范围

在流明中找不到类“验证器”