У меня большая и странная проблема с использованием 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), но это дополнительные расходы для клиента.
Проверка 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!
Других решений пока нет …