HTTP не перенаправляется на HTTPS для определенных маршрутов

Недавно я переключился на использование HTTPS на своем сервере, я нашел в Интернете код, который заставляет все входящие запросы к серверу использовать HTTPS:

<?php namespace App\Http\Auth\Middleware;

use Closure;

class HttpsProtocol {

    public function handle($request, Closure $next)
    {
        if (!$request->secure() && env('APP_ENV') === 'production') {
            return redirect()->secure($request->getRequestUri());
        }

        return $next($request);
    }

}

И добавил \App\Http\Auth\Middleware\HttpsProtocol::class к моему промежуточному программному обеспечению.

Однако теперь у меня есть следующий маршрут:

Route::controller('test', 'TestController');

И следующий контроллер:

<?php namespace App\Http\FrontEnd\Controllers;

use App\Http\FrontEnd\Requests;
use App\Http\FrontEnd\Controllers\Controller;

use Illuminate\Http\Request;
use App\Http\FrontEnd\Requests\TestRequest;

use App\Commands\SendEmail, App\Commands\SendSMS;

use Auth, Input, DB, Session, Queue, Crypt;

class TestController extends Controller {

    public function postCheck()
    {
        //
    }

    public function postConfirm()
    {
        //
    }

}

Теперь этот конкретный маршрут не будет работать, если я попытаюсь отправить сообщение по следующему URL-адресу:

/test/confirm

Это работает только тогда, когда я использую https, и я не могу понять, почему и как это исправить.


person user3718908    schedule 15.02.2016    source источник
comment
Вы действительно имели в виду Route::controller('test', 'TestController'); или это было Route::resources('test', 'TestController');   -  person Jilson Thomas    schedule 15.02.2016
comment
Да, я имел в виду route::controller   -  person user3718908    schedule 15.02.2016
comment
Я не думаю, что вы можете определить маршрут таким образом.   -  person Jilson Thomas    schedule 15.02.2016
comment
Что ты имеешь в виду? Это то, что я использовал, проверьте документы laravel.   -  person user3718908    schedule 15.02.2016
comment
Извини, я виноват. Не видел этого.   -  person Jilson Thomas    schedule 15.02.2016
comment
Вы уверены, что это связано с https, потому что вы, похоже, не обрабатываете пространство имен вашего контроллера на своем маршруте. Должно быть Route::controller('test', 'FrontEnd\TestController'); я считаю.   -  person user1669496    schedule 15.02.2016
comment
На самом деле этот маршрут является частью нескольких других маршрутов в route::group. Я указываю пространство имен внутри группы маршрутов, чтобы оно затрагивало их всех.   -  person user3718908    schedule 15.02.2016


Ответы (1)


Вы можете проверить этот вопрос/ответ: Laravel 5 - HTTPS-перенаправление htaccess на почтовых маршрутах не работает.

Хотя этот вопрос касается перенаправления htaccess, принцип тот же.

По сути, когда клиент получает доступ к http версии URL-адреса, ваш код отвечает перенаправлением 302 клиенту, говорящему ему использовать https URL-адрес. Затем клиент делает новый запрос к URL-адресу https, но неправильно использует запрос GET, а также удаляет исходные данные POST.

Чтобы решить проблему, когда клиенты неправильно меняли метод запроса при перенаправлении, они придумали новый код состояния перенаправления 307, который при реализации специально предназначен для перенаправления без изменения метода запроса. Вы можете попытаться решить эту проблему, ответив кодом 307, но, поскольку она появилась в HTTP/1.1, нет гарантии, что клиент поймет, как с ней справиться.

Чтобы ответить переадресацией 307 в коде:

return redirect()->secure($request->getRequestUri(), 307);

Тем не менее, любой обходной путь на самом деле просто побеждает цель повсеместного использования HTTPS. Если клиент отправляет POST-запросы на незащищенный URL-адрес, данные публикации уже могли быть скомпрометированы. Лучше всего просто отклонять POST-запросы к незащищенным URL-адресам, чтобы люди не думали, что POST-запросы на ваши незащищенные URL-адреса — это нормально.

person patricus    schedule 15.02.2016
comment
Вау, это многое объясняет! Узнал что-то новое! Большое спасибо за ваше время. :) - person user3718908; 16.02.2016