Wie sagt man if else in apache?
Dieter Raber
- webserver
Hallo,
Ich beziehe mich im folgenden auf PHP als serverseitige Sprache und Apache 2.x als Server.
Entwicklungs- und finale Versionen von Webseiten unterscheiden sich ja durch Dinge wie unterschiedliche Error-Settings und solchen Sachen. Die Grundidee ist es, eine Anwendung mit moeglichst wenigen Aederungen der Konfiguration auf beiden Servern bereitzustellen,
Um herauszufinden, ob eine Seite lokal oder auf einem entfernten Server laeuft, habe ich bisher zwei Varianten verwendet:
1. Den Server mit -D IS_LOCAL gestartet und darauf dann via
<IfDefine IS_LOCAL>
SetEnv IS_LOCAL true
</IfDefine>
auf das Ergebnis zugegriffen.
2. Im PHP-Script mit den verschiedenen IP-Bereichen, die fuer lokale Netze reserviert sind, jongliert, das sieht etwa so aus:
public static function isRemote() {
$ip_arr = explode('.', $_SERVER['SERVER_ADDR']);
if($ip_arr[0] == 10
|| ($ip_arr[0] == 192 && $ip_arr[1] == 168)
|| ($ip_arr[0] == 172 && $ip_arr[1] >= 16 && $ip_arr[1] <= 31)
|| $_SERVER['SERVER_ADDR'] == '127.0.0.1') {
return false;
}
return true;
}
Beide Versionen sind in ihrem Wirkungsgrad beschraenkt, Version 1 geht solange gut, wie IS_LOCAL wirklich auf jeder Entwicklungsmachine gesetzt ist, Version 2 scheitert zum Beispiel, wenn SERVER_ADDR aufgrund irgendeiner Sicherheitseinstellung im vorgenannten IP-Range liegt. Zudem gestattet mir die PHP-Version keine weiteren Servermanipulationen.
Ich ueberlege jetzt, in der .htaccess ohne irgendwelche Vorbedingungen, wie zB. dem -D parameter
SetEnv IS_REMOTE true
zu setzen, was man dann einfach ein-/auskommentieren koennte, sodass man via <IfDefine> darauf zugreifen koennte. Aus verschiedenen Gruenden waere mir aber sowas wie <If IS_REMOTE == true> lieber.
Meine Fragen:
Danke fuer Eure Antworten
Dieter
Guten Tag,
Meine Fragen:
- Kann man mit Apache sowas wie <If IS_REMOTE == true> machen?
Nein, aber du kannst z.B. SetEnvIf verwenden und die tatsächlich Logik in die Skripte verlagern (wobei du auch gleich im Skript auf die IP-Adresse testen kannst). Ich sehe das aber eher in der Apache-Konfiguration.
- Hat jemand bessere Konzepte, um herauszufinden, ob eine Application remote oder local ist (eigentlich interessiert mich das noch mehr)?
Ich mache das mit -D-Defines und <IfDefine>-Tests in der Apache-Konfiguration. Ich versuche Skripte möglichst weit unabhängig davon zu schreiben, ob sie nun gerade im Live-, Staging- oder Dev-Bereich laufen (ja, ich unterscheide da in drei Stufen). Vielleicht schaust du dir auch mal auto_append_file und auto_prepend_file in der php.ini an - ich setze den include_path übrigens auch über die Apache-Konfiguration.
Gruß
Christoph Jeschke
Hallo Christoph,
Ich stimme dir zu, dass IS_LOCAL/IS_REMOTE eher was fuer den Server als fuer PHP ist. Meine Scripte sind ebenfalls ziemlich unabhaengig vom Server, allerdings cache ich lokal nicht und komprimiere JS und CSS auch nicht, solche Sachen halt.
Dein Vorschlag mit auto_append_file ist mir allerdings nicht so ganz klar. Wenn ich dich recht verstehe, schlaegst du vor, dass ich ein PHP-Script in der Art <? $is_remote = true; ?> auto-prepende und dann in der Folge isset($is_remote) checke.
Dann stehe ich aber wieder vor dem Dilemma, dass ich die PHP-Ini auf allen betroffenen Maschinen aendern muss, also im Endeffekt wie bei -D.
Ich wuerde ausserdem gerne wissen, was der Stagingbereich ist, bedeutet das, dass die Applikation auf dem Testserver laeuft, bis die letzte Aenderung durch ist?
Gruss
Dieter
Guten Tag,
Ich stimme dir zu, dass IS_LOCAL/IS_REMOTE eher was fuer den Server als fuer PHP ist. Meine Scripte sind ebenfalls ziemlich unabhaengig vom Server, allerdings cache ich lokal nicht und komprimiere JS und CSS auch nicht, solche Sachen halt.
Um genau dieser Unabhängigkeit zu bewahren, würde ich diese Maßnahmen nicht in PHP implementieren, sondern in der Serverkonfiguration.
Dein Vorschlag mit auto_append_file ist mir allerdings nicht so ganz klar. Wenn ich dich recht verstehe, schlaegst du vor, dass ich ein PHP-Script in der Art <? $is_remote = true; ?> auto-prepende und dann in der Folge isset($is_remote) checke.
Nein. Du kannst auto_*pend_file dazu benutzen, dein PHP-Environment in den entsprechenden Kontext zu bringen, z.B. in dem du in dem auto-prepend-Skript entsprechende Einstellungen machst (ergänzend zu den Einstellungen im Server). Dazu würde ich aber auch immer PHP als (Fast-)CGI einbinden, denn dann kannst du ganze Ini-Files für PHP definieren, anstatt alles mit php_(admin_)* zu setzen.
Dann stehe ich aber wieder vor dem Dilemma, dass ich die PHP-Ini auf allen betroffenen Maschinen aendern muss, also im Endeffekt wie bei -D.
Nein, wieso? Da du verschiedene Ini-Files als auch verschiedene Defines angeben kannst, gibt es genau einen konfigurierten Server, der nur je nach Bereich mit anderen Parametern gestartet wird.
Ich wuerde ausserdem gerne wissen, was der Stagingbereich ist, bedeutet das, dass die Applikation auf dem Testserver laeuft, bis die letzte Aenderung durch ist?
Im Developmentbereich wird einfach nur entwickelt. Dementsprechend dürfen die Einstellungen etwas liberaler sein, so ist auch sowas wie xdebug und sehr liberales Error Reporting erlaubt.
Der Stagingbereich ist eine eins-zu-eins-Kopie des Produktivbereichs. Bevor irgendwas auf den Live-Bereich verschoben wird, muss es erst auf dem Staging-Bereich abgenommen werden.
Der Livebereich ist klar: Dort laufen nur stabile Versionen, die bereits getestet wurden.
Das lässt sich alles ganz gut automatisieren.
Gruß
Christoph Jeschke
Hallo Christoph
also sowie du das mit auto_*pend_file beschreibst, klingt das richtig interessant. Ich werde damit mal etwas experimentieren, um zu sehen, ob das was fuer mich ist. Ich will das mal nochmal zusammenfassen, um sicher zu sein, dass ich dich richtig verstanden habe:
.htaccess:
Server ist local
nimm diese PHP ini, die dir widerum sagen wird, ob und was es zu auto_prependen gibt
php auto_prepend.php:
benutze_keinen_cache();
komprimiere_nix();
usw()...
Erstmal jedenfalls vielen Dank fuer den Hinweis!
Der Stagingbereich ist eine eins-zu-eins-Kopie des Produktivbereichs[...]
Ok, das ist das was wir Demo nennen wuerden, so hatte ich mir das auch vorgestellt.
Gruss
Dieter
Guten Tag,
also sowie du das mit auto_*pend_file beschreibst, klingt das richtig interessant. Ich werde damit mal etwas experimentieren, um zu sehen, ob das was fuer mich ist. Ich will das mal nochmal zusammenfassen, um sicher zu sein, dass ich dich richtig verstanden habe:
.htaccess:
Server ist local
nimm diese PHP ini, die dir widerum sagen wird, ob und was es zu auto_prependen gibt
Im Groben, ja. In der httpd.conf würde das so aussehen:
<IfDefine DEVELOPMENT>
PHPIniDir /path/to/development-php.ini
</IfDefine>
<IfDefine STAGING>
PHPIniDir /path/to/staging-php.ini
</IfDefine>
etc.
Die jeweiligen php.inis definieren dann appends/prepends je nach Bedarf.
Zum Beispiel gibt meine debug.prepend.php die Superglobals aus und noch ein paar Informationen mehr. Ziel ist es, das komplette Debugging aus den Skripten an sich heraus zu halten (denn das sind potenzielle Fehlerquellen und Informationslecks).
php auto_prepend.php:
benutze_keinen_cache();
komprimiere_nix();
usw()...
Genau. Wobei das meiste dann doch ini_set/ini_get-Anweisungen sind, soweit diese dann noch setzbar sind. Ansonsten sind die in der jeweiligen php.ini definiert.
Gruß
Christoph Jeschke
- Kann man mit Apache sowas wie <If IS_REMOTE == true> machen?
Mit der Version 2.3/2.4 (noch nicht veröffentlicht) wird das funktionieren.
<If "$env{IS_REMOTE} = 'true'">
.....
</If>
Hi Bob,
danke fuer den Hinweis!
Gruss
Dieter