2014-04-22 20 views
18

Mam aplikację symfony2.Jak wymusić https dla prod, ale http dla środowiska dev?

Na serwerze prod chcę, aby wszystkie moje trasy przechodziły przez https, podczas gdy w dev chciałem móc korzystać z http. Jak osiągnąć to przy pomocy samego symfony2? Nie chcę dotykać konfiguracji serwera sieciowego.

Próbowałem dodając to w moim routing.yml

myBundle: 
    resource: "@MyBundle/Controller/" 
    type:  annotation 
    prefix: /
    schemes: [https] 

mając to w moim routing_dev.yml:

myBundle: 
    resource: "@MyBundle/Controller/" 
    type:  annotation 
    prefix: /
    schemes: [http] 

_main: 
    resource: routing.yml 

on nadal chce, aby przejść do https nawet w trybie dev.

+1

możliwe duplikat (http://stackoverflow.com/questions/16971030/in-symfony-how-can-i-require-http-in-a-dev-environment-and-https-in-production) – dmnptr

Odpowiedz

52

Można zdefiniować parametr za to. W app/config/config.yml określić:

parameters: 
    httpProtocol: http 

Następnie w app/config/config_prod.yml:

parameters: 
    httpProtocol: https 

I routing.yml zmiana:

myBundle: 
    resource: "@MyBundle/Controller/" 
    type:  annotation 
    prefix: /
    schemes: ['%httpProtocol%'] 

Opróżnij cache (oba prod i dev) i powinno działać.

+4

To świetny pomysł! Działa również w celu skonfigurowania 'security.yml'. –

+0

bardzo dobrze wyjaśnione – Baig

+3

Dla każdego, kto chce użyć tego pojedynczego przypadku w adnotacji, jest to sposób: @Route ("/ register.html", schematy = {"% httpProtocol%"}) – Nairebis

-2

myślę, że można sprawdzić program w app_dev.php pliku i bazy na który przekierowuje go na https

$url = parse_url($_SERVER['HTTP_REFERER']); 
if ($url['scheme'] == 'http') { 
    header("Location: https://{$_SERVER['SERVER_NAME']}{$_SERVER['PHP_SELF']}"); 
} 

albo może być w stanie zastosować pewne zmiany w .htaccess dla app_dev.php w adresie URL

+1

Niestety to nie jest możliwe, ponieważ na prod, port http jest zablokowane, więc nie mogę wykonać żadnego przekierowania i jest to również powód, dla którego nie chcę polegać na konfiguracji na serwerze, ale osiągnąć to w ramach konfiguracji symfony2. – k0pernikus

+0

Myślałem, że chcesz to zrobić tylko w trybie deweloperskim, a prod może używać zarówno http, jak i https – Javad

+0

. Jeśli port http jest zablokowany, w jaki sposób żądanie dotrze do apache'a, a co dopiero symfony – Henry

0

Moje pierwsze rozwiązanie działa dobrze, ale należy zadbać, aby nie zastępować własnych tras w urządzeniu routing_dev.yml. Na końcu pliku miałem

_main: 
    resource: routing.yml 

, więc cała moja trasa została zmieniona z powrotem na schemat https. Porządkowanie wpisów, aby mój niestandardowy wpis był ostatnim rozwiązaniem problemu.

+0

Próbowałem ustawić 'schematy: [https]' w mojej aplikacji/config/routing.yml w 'resource:" @ MyBundle/Resources/config/routing.yml "' ale to nie działa (nie wymusza HTTPS dla tras zdefiniowanych w moim pakiecie). Czy próbowałeś robić coś takiego jak proponujesz na trasach nie używając 'type: adnotation'? – RayOnAir

2

Zmień app.php ostatnie linie tak: [? W Symfony, jak mogę wymagać http w środowisku dev i HTTPS w produkcji]

if ($request->getScheme() === 'http') { 
    $urlRedirect = str_replace($request->getScheme(), 'https', $request->getUri()); 
    $response = new RedirectResponse($urlRedirect); 
} else { 
    $response = $kernel->handle($request); 
} 

$response->send(); 

$kernel->terminate($request, $response); 
+0

Nie chciałbym, aby kod był schematu w 'app.php', wolę mieć takie ustawienie w plikach konfiguracyjnych, aby łatwo zmienić ustawienia – k0pernikus

+0

Nie masz żadnego pliku konfiguracyjnego przed uruchomieniem jądra http! – zioMitch

+0

To nie jest do końca prawdą. Proszę spojrzeć na zaakceptowaną odpowiedź i na Odpowiedź brzmi: jak to działa dla mnie Nie było żadnych zmian w 'app.php' Podałeś działające rozwiązanie, ale żadne nie polecam – k0pernikus