Не удается отправить сообщение в маршрут ‘/’

#laravel #laravel-5 #laravel-7

#laravel #laravel-5 #laravel-7

Вопрос:

При запуске Laravel 5.4 (хотя это также происходит с 7.28) у меня есть страница входа в route ‘/’, поэтому запрос GET на этот маршрут загружает форму входа, и запрос POST должен попытаться аутентифицировать его. К сожалению, Laravel, похоже, рассматривает запросы POST как запросы GET (я подтвердил с помощью dump (), вводя переменные запроса), и поэтому перезагружает пустую страницу входа при отправке формы.

Если я изменю маршрут (URL) на ‘/ login’ (или что-нибудь еще), он будет работать нормально, так что это конкретная проблема для ‘/’.

Форма входа (login.blade.php ) имеет:

 <form id="loginform" class="contact form-horizontal" name="loginform" method="post" action="{{url('/')}}">
...
    <button type="submit" class="btn btn-lg btn-primary">Log In</button>
</form>
 

web.php:

 Route::get('/', 'MainController@login')->name('login');
Route::post('/', 'MainController@authenticate');
 

MainController.php:

 // Show login page
public function login() { return view('login', array('page' => 'login', 'error' => rand())); }

// Authenticate login:
public function authenticate(Request $request)
        {
        // Attempt a login with the email and password provided:
        if(Auth::attempt(['email' => $request->input('email'), 'password' => $request->input('password')]))
            {
            Log::info('LOGGED IN');
            return redirect()->route('main'); // Show main page
            }
        else return view('login', array('page' => 'login', 'error' => 'Sorry, wrong email or password, please try again')); // Login failed, show login form again
        }
 

Моя общая цель состоит в том, чтобы сайт представлял страницу входа в доменное имя, поэтому пользователю не нужно добавлять «/ login» в конце только для входа в систему.

Спасибо

РЕДАКТИРОВАТЬ: проверка сообщения браузера выявляет реальную проблему, Laravel отвечает перенаправлением 301 с http://localhost/pp/public таким образом, браузер немедленно выполняет запрос GET на http://localhost/pp/public / (примечание / в конце). Хм, как этого избежать?

Комментарии:

1. Вы действительно должны использовать встроенную аутентификацию Laravel, при этом промежуточное программное обеспечение аутентификации обрабатывает перенаправление, «чтобы пользователю не нужно было добавлять «/ login» в конце только для входа в систему».

2. Однако для решения вашей проблемы убедитесь, что все ваши кэши (маршрут, вид, конфигурация) очищены. Как вы определяете, что «Laravel, похоже, рассматривает запросы POST как запросы GET»? Вы подтвердили, что ваш браузер отправляет сообщение?

3. @miken32 спасибо за предложение, только что отредактировал сообщение выше, кажется, это настоящая проблема.

4. В вашем опубликованном коде нигде не упоминается pp/public . Как выглядит HTML-код вашей формы? action Содержит ли атрибут ожидаемое значение? Использование именованных маршрутов, как правило, лучше, чем полагаться на URL-адреса, которые могут измениться.

5. Извините, отображаемый URL-адрес публикации на странице входа в систему выглядит следующим образом: action=» localhost / pp / public »

Ответ №1:

Если вы хотите перенаправить своих пользователей на вход с домашней страницы, одним из способов может быть прямой доступ по адресу web.php:

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

Другим вариантом было бы изменить действие формы на другой маршрут, ведущий к этому контроллеру.

Так что в web.php вы бы так и сделали:

 Route::post('/login', 'MainController@authenticate')->name('loginAction');
 

и тег формы должен был бы изменить действие

 <form id="loginform" class="contact form-horizontal" name="loginform" method="post" action="{{route('loginAction')}}">
 

Для уверенности попробуйте команду artisan route:list, чтобы проверить все маршруты.