Laravel 5.6 подписанный URL не будет работать в APP_ENV = производство - PullRequest
0 голосов
/ 18 октября 2018

Я настроил два маршрута

Route::get('/bugreport', 'SomeController@create')
    ->middleware('signed')
    ->name('bugreport');

Route::get('/getlink', function() {
    return dd(\URL::signedRoute('bugreport', ['data' => 3]));
});

Когда APP_ENV=local, я могу посетить /getlink, затем нажать на полученный URL и показать его.Когда APP_ENV=production (реальная физическая среда не изменилась при изменении переменной), это больше не работает ... с неверной подписью.Какие-либо предложения?

ОБНОВЛЕНИЕ:

У нас есть ... что может быть его частью

class AppServiceProvider extends ServiceProvider
{
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    if (!config('app.is_local')) {
        URL::forceScheme('https');
    }
}

Примечание: удаление приведенного выше кода на самом деле решает эту проблему, но затемломает, например, логин ... так что либо нужно понять почему, либо это не вариант :(.

Обновление обновления:

Среда - геройка, а .htaccess имеет (согласноhttps://help.heroku.com/J2R1S4T8/can-heroku-force-an-application-to-use-ssl-tls)

#### FORCE SSL
## see - https://help.heroku.com/J2R1S4T8/can-heroku-force-an-application-to-use-ssl-tls
RewriteCond %{HTTP_HOST} !=localhost
# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]

# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on

# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
### End Force SSL

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

У меня была похожая проблема - ее можно решить очень просто, если вы используете промежуточное ПО TrustedProxy.

Если вы используете Heroku или AWS за балансировщиками нагрузки и у вас есть SSL, выгруженный для балансировки нагрузки, вы можетехотите доверять всем прокси, чтобы запрос Laravel мог обнаружить, что вы на самом деле используете соединение SSL.Тогда проверка подписанного URL будет работать.

Вы можете увидеть доку здесь:
Laravel 5.7 https://laravel.com/docs/5.7/requests#configuring-trusted-proxies
Laravel 5.6 https://laravel.com/docs/5.6/requests#configuring-trusted-proxies

0 голосов
/ 21 октября 2018

Обновление: используйте вместо принятого ответа.

Я, наконец, изолировал это, чтобы Heroku изменил протокол запросов, чтобы даже когда клиент делает запрос в https, laravel всегда получал его как http в объекте запроса.Обходной путь был

    if (!config('app.is_local') && strpos($request->url(), 'http:') !== false) 
    {
        $url = str_replace('http:', 'https:', $request->fullUrl());
        $request = Request::create($url);
    }

    if (!$request->hasValidSignature()) {
        return abort(403);
    }

Это было достаточно для моих нужд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...