Pracuję nad moim pierwszym projektem Laravel 5 i nie jestem pewien, gdzie i jak umieścić logikę, aby wymusić HTTPS w mojej aplikacji. Kluczowe jest tutaj to, że istnieje wiele domen wskazujących na aplikację i tylko dwie na trzy używają SSL (trzecia to domena rezerwowa, długa historia). Chciałbym więc zająć się tym w logice mojej aplikacji, a nie .htaccess.
W Laravel 4.2 przekierowanie dokonałem za pomocą tego kodu, znajdującego się w filters.php
:
App::before(function($request)
{
if( ! Request::secure())
{
return Redirect::secure(Request::path());
}
});
Myślę, że oprogramowanie pośredniczące jest miejscem, w którym powinno zostać zaimplementowane coś takiego, ale nie mogę tego rozgryźć, używając go.
Dzięki!
AKTUALIZACJA
Jeśli używasz Cloudflare tak jak ja, można to osiągnąć, dodając nową regułę strony w panelu sterowania.
php
laravel
laravel-routing
laravel-5
NightMICU
źródło
źródło
$_SERVER['HTTP_HOST']
Odpowiedzi:
Możesz sprawić, by działało z klasą oprogramowania pośredniego. Pozwól, że dam ci pomysł.
Następnie zastosuj to oprogramowanie pośredniczące do każdego żądania dodającego ustawienie reguły w
Kernel.php
pliku, na przykład:W powyższym przykładzie oprogramowanie pośredniczące przekieruje każde żądanie do https, jeśli:
production
. Po prostu dostosuj ustawienia zgodnie ze swoimi preferencjami.Cloudflare
Używam tego kodu w środowisku produkcyjnym z WildCard SSL i kod działa poprawnie. Jeśli usunę
&& App::environment() === 'production'
i przetestuję go w localhost, przekierowanie również działa. Tak więc posiadanie lub brak zainstalowanego SSL nie jest problemem. Wygląda na to, że musisz bardzo mocno skupić się na warstwie Cloudflare, aby zostać przekierowanym do protokołu Https.Edycja 23.03.2015
Dzięki
@Adam Link
sugestii: jest to prawdopodobnie spowodowane nagłówkami, które mija Cloudflare. CloudFlare prawdopodobnie trafia na twój serwer przez HTTP i przekazuje nagłówek X-Forwarded-Proto, który deklaruje, że przekazuje żądanie HTTPS. Musisz dodać kolejną linię w swoim oprogramowaniu pośrednim, która mówi ...... ufać nagłówkom, które wysyła CloudFlare. Spowoduje to zatrzymanie pętli przekierowań
Edycja 27/09/2016 - Laravel v5.3
Wystarczy dodać klasę oprogramowania pośredniego do
web
grupy wkernel.php file
:Edycja 23/08/2018 - Laravel v5.7
App::environment() === 'production'
. W poprzedniej wersji byłoenv('APP_ENV') === 'production'
.\URL::forceScheme('https');
faktycznie nie przekierowuje. Po prostu buduje linki,https://
gdy witryna jest renderowana.źródło
$request->setTrustedProxies( [ $request->getClientIp() ] );
aby ufać nagłówkom wysyłanym przez CloudFlare. Spowoduje to zatrzymanie pętli przekierowań.return redirect()->secure($request->getRequestUri(), 301);
$request->server('HTTP_X_FORWARDED_PROTO') != 'https'
to działało dla mnieInna opcja, która zadziałała dla mnie, w AppServiceProvider umieść ten kod w metodzie rozruchu:
Funkcja napisana przed forceSchema ('https') była błędna, jej forceScheme
źródło
\URL::forceScheme('https');
if($this->app->environment() === 'production'){ $this->app['request']->server->set('HTTPS', true); }
\URL::forceScheme('https')
Alternatywnie, jeśli używasz Apache, możesz użyć
.htaccess
pliku, aby wymusić na adresach URL używaniehttps
prefiksu. W Laravel 5.4 dodałem następujące wiersze do mojego.htaccess
pliku i zadziałało.źródło
RewriteCond %{HTTP_HOST} !=localhost
na dev, aby obejść ten problem.dla laravel 5.4 użyj tego formatu, aby uzyskać przekierowanie https zamiast .htaccess
źródło
Podobna do odpowiedzi manix, ale w jednym miejscu. Oprogramowanie pośredniczące do wymuszania protokołu HTTPS
źródło
Dotyczy to Larave 5.2.xi nowszych. Jeśli chcesz mieć możliwość obsługi niektórych treści przez HTTPS, a innych przez HTTP, oto rozwiązanie, które dla mnie zadziałało. Możesz się zastanawiać, dlaczego ktoś miałby chcieć udostępniać tylko niektóre treści przez HTTPS? Dlaczego nie obsługiwać wszystkiego przez HTTPS?
Chociaż obsługiwanie całej witryny przez HTTPS jest całkowicie w porządku, odcięcie wszystkiego przez HTTPS ma dodatkowe obciążenie na serwerze. Pamiętaj, że szyfrowanie nie jest tanie. Niewielki narzut ma również wpływ na czas odpowiedzi aplikacji. Można argumentować, że sprzęt jest tani, a wpływ jest znikomy, ale dygresję :) Nie podoba mi się pomysł obsługi dużych stron treści marketingowych z obrazami itp. Przez https. Więc oto jest. Jest podobny do tego, co inni sugerują powyżej, używając oprogramowania pośredniego, ale jest to pełne rozwiązanie, które pozwala przełączać się między HTTP / HTTPS.
Najpierw utwórz oprogramowanie pośredniczące.
Tak powinno wyglądać Twoje oprogramowanie pośredniczące.
Zauważ, że nie filtruję na podstawie środowiska, ponieważ mam konfigurację HTTPS zarówno dla lokalnego tworzenia, jak i produkcji, więc nie ma takiej potrzeby.
Dodaj poniższe do swojej trasy: RouteMiddleware \ App \ Http \ Kernel.php, abyś mógł wybrać i wybrać, która grupa tras ma wymuszać SSL.
Następnie chciałbym zabezpieczyć logowanie / rejestrację w dwóch podstawowych grupach itp. I wszystko inne za oprogramowaniem pośredniczącym uwierzytelniania.
Upewnij się, że oprogramowanie pośredniczące jest prawidłowo stosowane do tras z konsoli.
Teraz, gdy zabezpieczyłeś wszystkie formularze lub wrażliwe obszary aplikacji, kluczem jest teraz użycie szablonu widoku do zdefiniowania bezpiecznych i publicznych (innych niż HTTPS) łączy.
Na podstawie powyższego przykładu wyrenderowałbyś swoje bezpieczne linki w następujący sposób -
Niezabezpieczone linki mogą być renderowane jako
To powoduje renderowanie w pełni kwalifikowanego adresu URL, takiego jak https: // twójhost / login i http: // twójhost / aboutus
Jeśli nie wyrenderujesz w pełni kwalifikowanego adresu URL za pomocą http i użyjesz względnego adresu URL linku („/ aboutus”), to https będzie się utrzymywał po odwiedzeniu przez użytkownika bezpiecznej witryny.
Mam nadzieję że to pomoże!
źródło
A co z użyciem pliku .htaccess , aby uzyskać przekierowanie https? Powinien być umieszczony w katalogu głównym projektu (nie w folderze publicznym). Twój serwer musi być skonfigurowany tak, aby wskazywał katalog główny projektu.
Używam tego dla laravel 5.4 (najnowsza wersja w chwili pisania tej odpowiedzi), ale powinno nadal działać dla wersji funkcji, nawet jeśli laravel zmieni lub usunie niektóre funkcje.
źródło
RewriteCond %{HTTP_HOST} productiondomain\.com$ [NC]
Możesz użyć RewriteRule, aby wymusić ssl w .htaccess ten sam folder z twoim index.php
Proszę dodać jako zdjęcie jako załączenie, dodaj je przed wszystkimi innymi regułami
źródło
Dodaję tę alternatywę, ponieważ bardzo cierpiałem z tym problemem. Próbowałem różnych sposobów i nic nie działało. Więc wymyśliłem obejście tego problemu. Może to nie jest najlepsze rozwiązanie, ale działa -
produkcja <- Należy ją zastąpić wartością APP_ENV w pliku .env
źródło
w IndexController.php umieścić
w AppServiceProvider.php umieścić
}
W AppServiceProvider.php każde przekierowanie będzie skierowane do adresu URL https, a dla żądania http potrzebujemy raz przekierować, więc w IndexController.php wystarczy raz przekierować
źródło
Powyższe odpowiedzi mi nie pomogły, ale wygląda na to, że Deniz Turan przepisał plik .htaccess w sposób, który działa z systemem równoważenia obciążenia Heroku: https://www.jcore.com/2017/01/29/force-https -on-heroku-using-htaccess /
źródło
Oto jak to zrobić na Heroku
Aby wymusić SSL na swoich hamowniach, ale nie lokalnie, dodaj na końcu swojego .htaccess w public /:
Możesz to przetestować na swoim komputerze lokalnym za pomocą:
To ustawia nagłówek X-przekazany do postaci, jaką przyjmie na heroku.
tj. symuluje sposób, w jaki hamownia heroku zobaczy żądanie.
Otrzymasz tę odpowiedź na komputerze lokalnym:
To jest przekierowanie. Właśnie to heroku zwróci klientowi, jeśli ustawisz .htaccess jak powyżej. Ale to się nie dzieje na twoim lokalnym komputerze, ponieważ X-forwarded nie zostanie ustawione (sfałszowaliśmy to za pomocą curl powyżej, aby zobaczyć, co się dzieje).
źródło
Jeśli używasz CloudFlare, możesz po prostu utworzyć regułę strony, aby zawsze używać HTTPS: spowoduje to przekierowanie każdego żądania http: // na https: //
Oprócz tego musiałbyś również dodać coś takiego do swojej funkcji \ app \ Providers \ AppServiceProvider.php boot ():
Zapewniłoby to, że każdy link / ścieżka w Twojej aplikacji używa https: // zamiast http: //.
źródło
Trochę inne podejście, przetestowane w Laravel 5.7
PS. Kod zaktualizowany na podstawie komentarzy @ matthias-lill.
źródło
config('app.url')
zamiast tego. Ponadto Laravel posiada bardzo przydatną funkcję stringStr::startsWith(config('app.url'), 'https://')
.W przypadku Laravel 5.6 musiałem trochę zmienić stan, aby działał.
z:
Do:
źródło
To mi się udało. Zrobiłem niestandardowy kod php, aby wymusić przekierowanie go na https. Po prostu umieść ten kod w pliku header.php
źródło
Używam w Laravel 5.6.28 następnego oprogramowania pośredniego:
źródło
Najprościej byłoby na poziomie aplikacji. W pliku
dodaj następujące informacje:
i w metodzie boot () dodaj:
Powinno to przekierować wszystkie żądania do https na poziomie aplikacji.
(Uwaga: zostało to przetestowane z laravel 5.5 LTS)
źródło
Możesz po prostu przejść do aplikacji -> Dostawcy -> AppServiceProvider.php
dodaj dwie linie
użyj Illuminate \ Support \ Facades \ URL;
URL :: forceScheme ('https');
jak pokazano w poniższych kodach:
źródło
To działa dla mnie w Laravel 7.x w 3 prostych krokach przy użyciu oprogramowania pośredniczącego:
1) Wygeneruj oprogramowanie pośredniczące za pomocą polecenia
php artisan make:middleware ForceSSL
Oprogramowanie pośredniczące
2) Zarejestruj oprogramowanie pośredniczące w
routeMiddleware
pliku jądraJądro
3) Użyj go w swoich trasach
Trasy
tutaj pełna dokumentacja dotycząca oprogramowania pośredniego
========================
Metoda HTACCESS
Jeśli wolisz użyć
.htaccess
pliku, możesz użyć następującego kodu:Pozdrowienia!
źródło