gpt4 book ai didi

php - Laravel 5 redirect()->back() 没有按预期工作

转载 作者:可可西里 更新时间:2023-10-31 22:53:48 24 4
gpt4 key购买 nike

当没有设置 HTTP_REFERER 时,redirect()->back() 出现问题。

通常,当我使用 ID 作为参数打开我的 URL 以显示特定数据行时:http://my-domain/module/ID

如果指定的ID不存在或者当前登录的用户没有权限打开,则进行

if (!$this->checkPermission($id)) {
return redirect()->back()->withError('message');
}
// do my stuff to show the datarow

但是当我更改浏览器地址字段并加载一个不允许的 ID 时,就没有设置 HTTP_REFERERredirect()->back() 将我重定向到我在 View 中添加的最后加载的 JavaScript for_this_view.js(并显示它),如下所示:

app.blade.php

<!DOCTYPE html>
<html lang="de">
<head>
@section('head')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">

{!! HTML::style('assets/jquery-ui/jquery-ui.min.css?ver=1.11.4') !!}
<!-- some more scripts -->
@show
</head>

<body>
@yield('content')
</body>
</html>

show.blade.php

@extends('app')

@section('head')
@parent
{!! HTML::script('for_this_view.js') !!}
@stop

@section('content')
<!-- display datarow -->
@stop

redirect()->back() 在这里做什么?如果没有重定向回 l​​aravel 的 URL 是在猜测一个吗?为什么?也许永远有办法重定向。

这让我无法使用这个功能。

更新

啊,也许我发现了我的问题......

如果 JavaScript 存在于特定文件夹中,我会尝试动态加载它们。我这样做是因为我希望我的 JavaScript 像 View 一样被解析,以便在其中获取 Blade 语法。我在 /config/view.php 中添加了一个特定的文件夹,并制作了类似 for_this_view_js.blade.php 的文件。它们作为 for_this_view.js 动态添加到 routes.php 中。

因此我做了类似的东西:

/* load view javascripts */
/** @var \SplFileInfo $path */
foreach (new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(public_path())
) as $path)
{
if ($path->isFile()
&& ends_with($path->getFilename(), 'js.blade.php'))
{
Route::get('url_to_javascript.js', function() {
$contents = View::make('for_this_view_js(.blade.php)');
$response = Response::make($contents);
$response->header('Content-Type', 'application/javascript');
return $response;
});
}
}

最佳答案

如果没有HTTP_REFERER已设置,Laravel 尝试从 session 中获取最后一个请求。此 URL 存储在 Illuminate\Session\Middleware\StartSession 中:

protected function storeCurrentUrl(Request $request, $session)
{
if ($request->method() === 'GET' && $request->route() && ! $request->ajax())
{
$session->setPreviousUrl($request->fullUrl());
}
}

如您所见,不幸的是您的 JS 请求满足了一些条件:

  1. 获取方法
  2. 由路由处理
  3. 不是ajax请求

解决方案

在我看来,您有两个选择。

禁用中间件

警告:我还没有测试过这个,可能会有副作用

转到 app/Http/Kernel.php并删除 'Illuminate\Session\Middleware\StartSession',来自 $middleware .现在如果没有 HTTP_REFERER设置后,Laravel 将简单地重定向到你的应用程序的根目录(/)

扩展中间件并添加额外的约束

您可以扩展中间件并添加一些额外的检查:

class CustomStartSession extends \Illuminate\Session\Middleware\StartSession {
public function storeCurrentUrl(Request $request, $session){
if(!ends_with($request->url(), '.js')){
parent::storeCurrentUrl($request, $session);
}
}
}

然后通过替换原来的StartSession来启用它在 app/Http/Kernel.php与您的请求以及任何以 .js 结尾的 URL 的请求不会被保存为“以前的网址”

更新

显然,中间件需要注册为单例才能发挥全部功能。您可以通过在 register 中添加它来做到这一点您的服务提供商之一的方法(例如 AppServiceProvider )

$this->app->singleton('App\Http\Middleware\CustomStartSession');

关于php - Laravel 5 redirect()->back() 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29367404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com