Laravel 5.6 - 验证发送到索引,而不是有错误的前一页

Laravel 5.6 - Validation sending to index, not to previous page with errors

在 register.blade.php 中提交表单时,您将被重定向回索引,而不是返回到显示错误的原始页面。我不确定这是为什么。

调用了控制器中的创建方法,但在验证后执行停止(符合预期)。没有重定向回那里的索引,所以我不确定它为什么选择回到那里。据我了解,它默认重定向回有错误的表单。

路线:

<?php

Route::get('/', function () {
    return view('pages.index');
});

Route::get('/home', function () {
    return redirect('/');
});

// Login //
Route::get('/user/login', function () {
    return view('pages.user.login');
});
Route::post('/user/login', 'UserController@store');

// Register //
Route::get('/user/register', function () {
    return view('pages.user.register');
});
Route::post('/user/register', 'UserController@create');
Route::post('/user/register', 'UserController@create');

// Logout //
Route::get('/user/logout', 'UserController@destroy');

register.blade.php

@extends ('layout.master')

@section ('content')

<div class="row">
    <div class="col-md-12">
        <h1 align="center">User Registration</h1>
        <br>
        <form method="POST" action="/user/register">

            {{ csrf_field() }}

            <div class="form-group row">
                <label for="name" class="col-sm-2 col-form-label">Full Name</label>
                <div class="col-sm-10">
                    <input name="name" type="text" class="form-control" placeholder="Full Name">
                </div>
            </div>

            <div class="form-group row">
                <label for="phonenumber" class="col-sm-2 col-form-label">Phone Number</label>
                <div class="col-sm-4">
                    <input name="phonenumber" type="tel" class="form-control" placeholder="Phone Number">
                </div>

                <label for="password" class="col-sm-2 col-form-label">Password</label>
                <div class="col-sm-4">
                    <input name="password" type="password" id="password" class="form-control">
                </div>
            </div>

            <div class="form-group row">
                <label for="email" class="col-sm-2 col-form-label">Email</label>
                <div class="col-sm-4">
                    <input name="email" type="email" class="form-control" placeholder="Email">
                </div>

                <label for="password_confirmation" class="col-sm-2 col-form-label">Confirm Password</label>
                <div class="col-sm-4">
                    <input name="password_confirmation" type="password" id="password_confirmation" class="form-control">
                </div>
            </div>

            <div class="form-group row">
                <label for="street_address" class="col-sm-2 col-form-label">Street Address</label>
                <div class="col-sm-10">
                    <input name="street_address" type="text" class="form-control" placeholder="Street Address">
                </div>
            </div>

            <div class="form-group row">
                <label for="city" class="col-sm-2 col-form-label">City / Town</label>
                <div class="col-sm-10">
                    <input name="city" type="text" class="form-control" placeholder="City / Town">
                </div>
            </div>

            <div class="form-group row">
                <label for="region" class="col-sm-2 col-form-label">State / Province / Region</label>
                <div class="col-sm-10">
                    <input name="region" type="text" class="form-control" placeholder="State / Province / Region">
                </div>
            </div>

            <div class="form-group row">
                <label for="zip" class="col-sm-2 col-form-label">Postal Code</label>
                <div class="col-sm-10">
                    <input name="zip" type="text" class="form-control" placeholder="Postal Code">
                </div>
            </div>

            <div class="text-center">
                <button type="submit" class="btn btn-primary text-center">Submit</button>
            </div>

        </form>

        <br>

        @include('layout.errors')
    </div>
</div>

@endsection

errors.blade.php

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

控制器:

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    // Register
    public function create(Request $request)
    {
        // Form Validation
        $this->validate(request(), [
            'name' => 'required',
            'email' => 'required|email|unique:users',
            'phonenumber' => 'required|regex:/^[0-9]{10}$/|unique:users',
            'street_address' => 'required',
            'city' => 'required',
            'region' => 'required',
            'zip' => 'required',
            'password' => 'required|confirmed'
        ]);

        // Create and save the user.
        $user = User::create([
            'name' => request('name'),
            'email' => request('email'),
            'phonenumber' => request('phonenumber'),
            'street_address' => request('street_address'),
            'city' => request('city'),
            'state' => request('state'),
            'zip' => request('zip'),
            'password' => bcrypt(request('password'))
        ]);

        // Sign in the user.
        //auth()->login($user);

        return redirect('/test');
    }

    // Login
    public function store()
    {
        if (auth()->attempt(request(['email', 'password'])))
        {
            return redirect('/');
        } 
        else 
        {
            return Redirect::back()->withErrors(['Invalid email or password!']);
        }       
    }

    // Logout
    public function destroy()
    {
        auth()->logout();

        return redirect('/user/login');
    }
}

问题出在我的 Firefox 配置设置上。太私密了...

我遇到了完全相同的问题。详细说明 OP self-answer,此问题是由 Firefox 的 'network.http.referer.trimmingPolicy' 配置键引起的,该键控制发送的 'Origin' header.

在我的例子中,这个键被设置为 (int) 2,这使得浏览器只发送没有 URI 的网站地址。

将密钥更改为 (int) 0 解决了问题(可以尝试将其设置为 (int) 1)。

对于可能遇到此问题的某些人。我使用 content="origin" 政策设置了 referrer 元标记。

这样一来,重定向将始终指向您的 'origin'。

<meta name="referrer" content="origin">更改为<meta name="referrer" content="origin-when-cross-origin">

更多信息在此article