Schick programmiert

Symfony – nginx: Environment nach Cookie bestimmen

Mir kam die Idee, ob es nicht möglich ist anhand eines Cookies zu entscheiden, ob Symfony nun in der Production– oder Development-Environment geladen werden soll.

Die Antwort ist: Ja!
Für nginx habe ich eine Möglichkeit gefunden und möchte sie euch hier zur Verfügung stellen:

server {
	listen 80;
	server_name *.sf2;

	root /var/www/$host/web;
	access_log /var/www/log/nginx.sf2.access.log;
	error_log /var/www/log/nginx.sf2.error.log;

	location / {
		if (-f $request_filename) {
			break;
		}

		set $app_index app_dev.php;
		if ($http_cookie ~ "(; )?env=prod") {
			set $app_index app.php;
		}

		index $app_index;

		rewrite ^(.*)$ /$app_index last;
	}

	location ~ (app|app_dev).php {
		fastcgi_pass 127.0.0.1:9000;
		include fastcgi_params;
	}
}

Für jemand, der noch nicht so mit nginx vertraut ist empfehle ich die Dokumentation von nginx anzusehen.

Der oben beschriebene Code erstellt einen neuen vHost, der auf alle *.sf2 Domains reagiert. Dieser bekommt als Root-Pfad den web-Ordner aus dem Symfony-Projekt zugewiesen. Bei jedem Aufruf wird nun geprüft, ob der string HTTP_COOKIE den Wert env=prod enthält – mit anderen Worten – es wird geprüft ob der Cookie env den Wert prod enthält. Wenn ja, werden alle nicht gefundenen Resources nach app.php geleitet, sonst nach app_dev.php.
Über die zweite Location-Anweisung wird sicher gestellt, das einzig diese beiden Dateien (app.php und app_dev.php) an den PHP-Parser weitergeleitet werden, der lokal auf dem Port 9000 lauscht.

Diese Konfiguration wird aktuell auf meinem Testsystem eingesetzt und hat bisher noch keine Probleme gemacht. Wenn ihr wollt, könnt ihr das ganze auch umdrehen und auf eurem Production-Server einsetzen – dann würde ich aber noch die IP mit einbeziehen, damit nicht jeder auf die Development-Environment zugreifen kann.

Wenn jemand diese Lösung für andere Systeme umsetzen möchte, darf er das gerne in den Kommentaren oder in seinem eigenen Blog tun (dann hätt ich aber gerne nen Link in meinen Kommentaren).


Categorised as: Uncategorized


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.