Laravel 拒绝在 iFrame 中显示为“'X-Frame-Options' 到 'SAMEORIGIN'”。

Laravel refusing to display in iFrame as "'X-Frame-Options' to 'SAMEORIGIN'."

所以我在 Laravel 中构建了一个表单并在外部托管,但我想在 HTML 页面中显示它,但 X-Frame-Options 有问题。

确切的错误信息是:

Refused to display 'url' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.

我在之前的 Whosebug 回答中看到这是由于 FrameGuard Middleware 造成的,但此后已被删除,问题代码行不在该文件中。

Laravel 版本 5.3.

我也尝试过使用 flooring 在 Nginx 配置文件中设置 X-Frame-Options,但没有结果:

sed -i 's/http\ {/http\ {\nadd_header X-Frame-Options SAMEORIGIN, false;\n\n/' /etc/nginx/nginx.conf

此错误在多个浏览器中发生,已测试:Chrome & Safari

将框架的响应设置为 header

X-Frame-Options: ALLOW-FROM https://example.com/

其中 example.com 是请求表单的域。

您可以使用 laravel 中的中间件来执行此操作。

生成一个新的中间件。

php artisan make:middleware FrameHeadersMiddleware

然后在您刚刚创建的中间件的句柄函数中执行如下操作:

namespace App\Http\Middleware;
use Closure;

public function handle($request, Closure $next)
{
     $response = $next($request);
     $response->header('X-Frame-Options', 'ALLOW FROM https://example.com/');
     return $response;
 }

然后您可以将其添加到 Kernel.php

中的中间件数组之一
protected $middleware = [
    App\Http\Middleware\FrameHeadersMiddleware::class
];

或者如果您只想将它​​添加到特定路由,则添加到中间件组数组之一。

在我的例子中,nginx 阻止了访问。

运行:

grep -ri "X-Frame-Options" /etc/nginx        

并检查输出:

/etc/nginx/snippets/ssl-params.conf:add_header X-Frame-Options DENY;

DENY 替换为 SAMEORIGIN 后,一切都按预期开始工作。