Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 奇怪的行为使用;“重定向回”;和2个或更多带有Laravel 5的选项卡,仅在服务器上_Php_Laravel_Redirect_Http Referer_Referer - Fatal编程技术网

Php 奇怪的行为使用;“重定向回”;和2个或更多带有Laravel 5的选项卡,仅在服务器上

Php 奇怪的行为使用;“重定向回”;和2个或更多带有Laravel 5的选项卡,仅在服务器上,php,laravel,redirect,http-referer,referer,Php,Laravel,Redirect,Http Referer,Referer,我在共享主机上使用Laravel5.4时遇到了一个大而奇怪的问题 当laravel使用“重定向回”时,它将重定向到上次访问的页面 让我们想象一下: 我们有一个网站有两个部分:产品和类别。 我们访问产品页面,url为site.com/products。此页面有3个按钮,新建、编辑和图库 我们想编辑ID为3的producto(../products/3/edit),因此我们编辑它的信息并保存它。这里没有问题,验证正常 但是我们需要再次编辑产品,因此我们进入编辑页面(../products/3/edi

我在共享主机上使用Laravel5.4时遇到了一个大而奇怪的问题

当laravel使用“重定向回”时,它将重定向到上次访问的页面

让我们想象一下:

我们有一个网站有两个部分:产品和类别。 我们访问产品页面,url为site.com/products。此页面有3个按钮,新建、编辑和图库

我们想编辑ID为3的producto(../products/3/edit),因此我们编辑它的信息并保存它。这里没有问题,验证正常

但是我们需要再次编辑产品,因此我们进入编辑页面(../products/3/edit)。name字段最多接受10个字母,但我们键入了11个。我们在不同的选项卡上打开类别页面(。/categories)。然后我们按下“保存”按钮,但验证将失败,因为名称字段有11个字母

还有booomLaravel重定向到类别页面,因为这是最后打开的页面,但它应该将我们重定向到编辑页面

如果我使用“表单请求验证”(公共函数更新(ExampleRequest$request){…}),就会发生这种情况

或者如果我使用一个简单的请求验证 ($request->validate(['title'=>'max:10,…]);)

两个例子都有相同的问题

另一方面,使用控制器时,如果我使用返回重定向()->back()…返回重定向::back()…,同样的行为也会发生,它会重定向到最后打开的页面

因此,当我创建、更新、删除等时,如果验证失败,或者如果我使用redirect()->back(),这会将我重定向到最后打开的页面,如果我在另一个选项卡中打开了一个页面,则该页面将是“redirect”发送给我的位置。如果我只使用一个标签,一切都很好

我的所有表单都会发生这种情况,仅在服务器上,本地环境正常

现在,我的代码:

.htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    # To switch to PHP 7
    AddType application/x-httpd-php56 .php

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.example.com [NC]
    RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>
产品请求

<?php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class ProductRequest extends FormRequest{

  public function authorize(){
    return true;
  }

  public function rules()
  {
    return [
      'title' => 'required|max:10|...',
      'otherfield' => ['required', Rule::in([...]),],
      ...
    ];
  }
}
在我的本地环境中,当前URL在服务器标题会话中接收:

public function xxx(Request $request, $id){
      dd($request);
      ...
+server: ServerBag {#42 ▼
    #parameters: array:29 [▼
      ...
      "HTTP_REFERER" => ".../products/3/edit"
      ...
...
..
+headers: HeaderBag {#44 ▼
    #headers: array:12 [▼
      ...
      "referer" => array:1 [▼
        0 => ".../products/3/edit"
        ]
      ...
...
..
#session: Store {#409 ▼
    ...
    #attributes: array:4 [▼
      ...
      "_previous" => array:1 [▼
        "url" => ".../products/3/edit"
        ]
      ...
如果用户访问了其他选项卡中的另一个页面,会话对象可能会更改,但这不是本地环境的问题,因为我们有HTTP\u REFERERREFERER

但是在服务器上,HTTP\u REFERER和REFERER不存在,只有会话内的url

所以我必须找到为什么会这样。我不想为每个表单、验证等添加特定的url〜〜


我不确定,但是,我正在考虑寻找一个新的主机,可能是digitalocean、linode,并添加一个SSL证书,因为我必须做一些更改来使用共享主机(我遵循这个,min 5:43),但这对客户端来说是一个额外的成本。

Laravel的验证、重定向程序以及任何其他决定上一个或“返回”的内容URL都使用相同的逻辑。该方法首先检查Referer HTTP请求头是否存在——如果存在,则使用此URL。如果没有,它将检查Laravel在启用会话的每个请求上保存的特殊“previous URL”会话值,并使用该值

根据您的解释,似乎没有发送或识别Referer头,而Laravel正在返回到以前的URL会话值。根据以下情况,有一种可能性:

如果使用了不安全的HTTP请求,并且引用页面是通过安全协议(HTTPS)接收的,则浏览器不会发送Referer标头

除此之外,我不确定是什么原因导致引用者丢失/被忽略

然而,我可以建议您不要依赖于Laravel的前/后功能,而是尽可能明确您想要重定向到的URL

对于表单请求,这非常简单。有三种不同的属性可供选择以设置重定向URL:

/**
 * The URI to redirect to if validation fails.
 *
 * @var string
 */
protected $redirect;

/**
 * The route to redirect to if validation fails.
 *
 * @var string
 */
protected $redirectRoute;

/**
 * The controller action to redirect to if validation fails.
 *
 * @var string
 */
protected $redirectAction;
对于其他更多的“automagic”解决方案,无效请求通常会导致抛出
illighted\Validation\ValidationException
。您可以捕获此链接,并通过添加
重定向到
URL来修改它:

try {
    $request->validate([ /* rules */ ]);
} catch (ValidationException $e) {
    $e->redirectTo(route('route.name'));
    throw $e;
}
最好不要在多个地方使用它,所以我希望你能找到Referer问题的根源

try {
    $request->validate([ /* rules */ ]);
} catch (ValidationException $e) {
    $e->redirectTo(route('route.name'));
    throw $e;
}