странное поведение с использованием & quot; перенаправить назад & quot; и 2 или более вкладок с Laravel 5, только на сервере

У меня большая и странная проблема с использованием Laravel 5.4 на виртуальном хостинге.

Когда laravel использует «redirect back», он перенаправляет на последнюю посещенную страницу.

Давайте представим это:

У нас есть сайт с 2 разделами: товары и категории.
Мы заходим на страницу продуктов и URL site.com/products. На этой странице есть 3 кнопки, новая, редактировать и галерея.

Мы хотим отредактировать товар с ID 3 (…/ Продукты / 3 / редактировать) поэтому мы редактируем информацию и сохраняем ее. Никаких проблем здесь, проверки были ок.

НО нам нужно снова редактировать продукт, поэтому мы идем на страницу редактирования (…/ Продукты / 3 / редактировать). Поле имени принимает максимум 10 букв, но мы набрали 11. Мы открываем страницу категорий на другая вкладка (../ категории). Затем мы нажимаем кнопку «Сохранить», но проверка не удастся, потому что поле имени состоит из 11 букв.

И бум! Laravel перенаправить на страницу категорий потому что это была последняя открытая страница, но она должна перенаправить нас на отредактировать страницу.

Это происходит, если я использую «проверку запроса формы» (обновление публичной функции (ExampleRequest $ request) {…})

или если я использую простую проверку запроса
($ request-> validate ([‘title’ => ‘max: 10, …]);)

Оба примера имеют одну и ту же проблему.

С другой стороны, работа с контроллерами, если я использую return redirect () -> back () … или же return Redirect :: back () …, происходит то же самое, он перенаправляет на последнюю открытую страницу.

Итак, когда я создаю, обновляю, удаляю и т. Д., Если проверка не удалась или я использую redirect () -> back (), это перенаправит меня на последнюю открытую страницу, и если я открыл страницу в другой вкладке, та страница будет где «перенаправление» отправит мне. Если я использую только 1 вкладку, все работает нормально.

Это происходит со всеми моими формами и только на сервере, местная среда в порядке.

Теперь мой код:

.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>

контроллер

use App\Http\Requests\ProductRequest;

public function update(ProductRequest $request, $id)
{
$product = Product::findOrFail($id);
$product->update( $request->all() );

$msgResponse = [...message...];

return Redirect::to('/products')->with($msgResponse);
}

ProductRequest

<?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([...]),],
...
];
}
}

Сайт:

PHP 7.0, Общий сервер, Laravel 5.4

Пожалуйста помоги! 🙁

БОЛЬШЕ ИНФОРМАЦИИ

Как сказал (или набрал = p) @Aken Roberts, проблема в том, Заголовок реферера

Я пытался проверить, что отправлено на $ запрос с помощью дд (…) :

public function xxx(Request $request, $id){
dd($request);
...

В моем местная среда, текущий URL получен внутри сервер, заголовки а также сессия :

+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_REFERER а также реферер

Но на сервер, HTTP_REFERER а также реферер не существует, только URL внутри сессия.

Поэтому я должен выяснить, почему так происходит. Я не хочу добавлять конкретный URL для каждой формы, проверок и т. Д. 〜.〜

Я не уверен, но я думаю о поиске нового хостинга, возможно, digitalocean, linode и добавления SSL-сертификата, потому что мне пришлось внести некоторые изменения, чтобы использовать виртуальный хостинг (я следовал этому видео, мин 5:43), но это дополнительные расходы для клиента.

0

Решение

Проверка Laravel, Redirector и все остальное, что определяет предыдущий или «обратный» URL, используют ту же логику. Illuminate\Routing\UrlGenerator::previous() Метод сначала проверяет, существует ли заголовок HTTP-запроса Referer — если это так, он использует этот URL. Если нет, он проверяет специальное значение сеанса «предыдущий URL», которое Laravel сохраняет при каждом запросе, где сеансы включены, и использует его.

Исходя из вашего объяснения, кажется, что заголовок Referer не отправляется или не распознается, и Laravel возвращается к предыдущему значению сеанса URL. Одна возможность в соответствии с MDN Docs:

Заголовок Referer не отправляется браузерами, если используется незащищенный HTTP-запрос и ссылающаяся страница была получена по безопасному протоколу (HTTPS).

Кроме того, я не уверен, что может привести к тому, что Реферер будет отсутствовать / игнорироваться.

Однако я могу предложить вам не полагаться на предыдущую / обратную функциональность 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;

Для других более «автоматических» решений неправильный запрос обычно приводит к выбрасыванию Illuminate\Validation\ValidationException, Вы можете поймать это и изменить его, добавив redirectTo URL:

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

Было бы неплохо избегать использования этого в нескольких местах, поэтому я надеюсь, что вы сможете докопаться до сути вопроса Referer!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]