Php 奇怪的行为使用;“重定向回”;和2个或更多带有Laravel 5的选项卡,仅在服务器上
我在共享主机上使用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”发送给我的位置。如果我只使用一个标签,一切都很好 我的所有表单都会发生这种情况,仅在服务器上,本地环境正常 现在,我的代码: .htaccessPhp 奇怪的行为使用;“重定向回”;和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
<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 REFERER和REFERER
但是在服务器上,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;
}