[Apache] AddHandler mit Bedingung; oder auch: dynamische Änderung von .htaccess

joschilein

Multitalent
ID: 9301
L
5 Mai 2006
1.393
151
Ich möchte meine Scripte sowohl on- als auch offline testen können, wenn sie beide den absolut selben Stand haben. Dazu zählt auch die .htaccess.

Online muss ich etwas einfügen um wie gewünscht PHP 5.3 zu erhalten:
Code:
AddHandler php-5.3 .php

Nur führt das dazu, dass offline nur der Quellcode der php-Dateien zu sehen ist. Vermutlich weil "php-5.3" als Handler nicht bekannt ist. In der gesamten Apache-Config (Xampp) finde ich auch keine Stelle, an der sowas schonmal in ähnlicher Form existiert. Mit SetHandler komme ich auch nicht weiter.

Auch finde ich keine Direktive (z.B. hier), die mir irgendwie helfen könnte.

Am liebsten wäre mir ja sowas:
Code:
<if ... != 127.0.0.1>
  AddHandler php-5.3 .php
</endif>
 
Zuletzt bearbeitet:
Hast du schon probiert das ganze über die <Location>-Direktive zu regeln?

<Location>-Direktive

Code:
<Location [I]OnlineDomain[/I]>
    AddHandler php-5.3 .php
</Location>

Oder

Code:
<VirtualHost [I]OnlineIP[/I]>
    AddHandler php-5.3 .php
</VirtualHost>

Edit: Sind aber beide in deinen obrigen Link vorhanden.
 
Zuletzt bearbeitet:
Hatte ich auch schon mal probiert und jetzt wieder, aber ich bekomme in jeder Kombination nur einen Error 500 um die Ohren gehauen.

Code:
<Location "127.0.0.1">
</Location>

Egal ob leer oder befüllt, ob mit oder ohne Anführungszeichen, ob mit Location oder VirtualHost, ob mit Regex (~) oder nicht, ... immer ein 500er.
 
Die Action musst du auch anpassen ;)

Is immer die Form:
Code:
AddHandler [COLOR="Red"]deinAusdruck[/COLOR] .php
Action [COLOR="#ff0000"]deinAusdruck[/COLOR] /var/foo/php
Du koppelst dann die Erweiterung .php erst an den Handler und im zweiten Schritt weist du an, was passieren soll, wenn der Handler greift.
 
Die Action musst du auch anpassen ;)

Is immer die Form:
Code:
AddHandler [COLOR="Red"]deinAusdruck[/COLOR] .php
Action [COLOR="#ff0000"]deinAusdruck[/COLOR] /var/foo/php

Das ist nicht ganz korrekt, wie auch der Apache-Doku zu entnehmen ist.

Das hilft dem Threadersteller zwar noch nicht wirklich weiter, verhindert aber evtl. Fehlersuche an der falschen Stelle... ;)
 
Was sagt denn die Error-Log?

Code:
[..].htaccess: <Location not allowed here
[..].htaccess: <VirtualHost not allowed here
Aber auf diesen Server habe ich ja vollen Zugriff. Ich weiß nur nicht was ich wo ändern müsste.

Du koppelst dann die Erweiterung .php erst an den Handler und im zweiten Schritt weist du an, was passieren soll, wenn der Handler greift.
Ja super, nur dann kann der Online-Server ja wieder nichts mit anfangen. Ich will ja nicht endlos hin und her jonglieren um die Nebenwirkung des einen mit einer Nebenwirkung des anderen zu beheben. Es muss doch irgendwie möglich sein, mit einer einfachen Bedingung die beiden Server zu unterscheiden, z.B. da der eine definitiv auf die allbekannte IP-Adresse 127.0.0.1 hört.

Nur wie bringe ich dem Apache etwas bei, das sich in php ganz einfach so machen ließe?
PHP:
if ($_SERVER['REMOTE_ADDR'] != '127.0.0.1'){
  // AddHandler ...
}
 
Nur wie bringe ich dem Apache etwas bei, das sich in php ganz einfach so machen ließe?
PHP:
if ($_SERVER['REMOTE_ADDR'] != '127.0.0.1'){
  // AddHandler ...
}

Ich glaube kaum das der Apache so gebaut ist das er zeitgleich auf verscheidenen Servern laufen soll. Daher wird es etwas äquivalentes nicht geben. Der Apache geht davon aus das er nur auf einen Server läuft. Daher macht es seites Apache keinen Sinn so eine Funktion einzubaun. Gerne lass ich mich eines besseren belehren.

Wenn du Root Zugriff auf den Server hast gibt es allerdings eine Alternative.
Du könntest den Apache mit einem Parameter starten zb. -D Online .

Dann könntest du in der .htaccess folgendes benutzen.
Code:
<IfDefine [I]Online[/I]>
     AddHandler php-5.3 .php
</IfDefine>


Mehr fällt mir dazu auch nicht mehr ein.

Ganz schön viel Aufwand den du dafür aufwendest. Da würd ich einfach meim Übertragen der Dateien auf den Server die .htaccess auslassen.
 
Mit Parameter starten ist mit Xampp auch nicht so wundervoll. Gibt es nicht noch eine andere Möglichkeit etwas in der Config zu definieren, das dann von IfDefine gefangen wird?

Da ich aktuell ständig noch mit den RewriteRules & Co. rumspiele, ist es mit einem Auslassen der .htaccess nicht getan. Aber notfalls mache ich online dann noch eine Ordnerebene dazu, in der dann eine andere .htaccess ganz unsynchronisiert mit ihrem AddHandler rumliegt.
 
Ich hab mit meinem Vorschlag den Online Server gemeint, also das Produktivsystem. Ist halt die Frage ob man da rumspielen möchte.

IDefine nimmt soweit ich weiß nur die Parameter vom starten an.

Man könnte noch einfach ein Include missbrauchen und eine Datei online ablegen die den Addhandler Befehl enthält. Auf dem Testsystem wäre dann die zu includierende Datei leer.

Was mir noch eingefallen ist wäre ein Modul zu schreiben. Hab ich noch nie gemacht keine Ahnung was das für Aufwand ist. Eventuell reicht da ja auch nur das vorhandensein der Datei?
Dann könnte man analog zu IfDefine ein IfModule verwenden.
 
Code:
[..].htaccess: <Location not allowed here
[..].htaccess: <VirtualHost not allowed here
Aber auf diesen Server habe ich ja vollen Zugriff. Ich weiß nur nicht was ich wo ändern müsste.
Die beiden Direktiven sind nicht für eine .htaccess gedacht, sondern für den vHost oder die Serverkonfiguration.
Ansonsten habe ich leider grade aber auch keine Lösung zur Hand.
 
Nur interessehalber, läuft PHP 5.3 online als (f)CGI und lokal als mod_php?
Online: CGI (phpinfo in ORIG_SCRIPT_FILENAME und ORIG_SCRIPT_NAME zu sehen)
Offline: existieren diese Zeilen gar nicht, dafür gibts ein mod_php5.
Also ja.

[..]notfalls mache ich online dann noch eine Ordnerebene dazu, in der dann eine andere .htaccess ganz unsynchronisiert mit ihrem AddHandler rumliegt.
Die Idee hat sich leider wieder zerschlagen, da ich bereits im Basisordner eine htaccess mit den RewriteRules brauche und die Domain bei diesem Hoster nicht auf einen Unterordner stellen kann.
 
Nur zur Info (notfalls für mich selbst :mrgreen:)
Der Grund zur regelmäßigen Änderung der .htaccess war eine Art Versionsweiche, wobei pro Version ein Unterordner mit allen Projektdateien liegt (php's, Bilder, Unterordner, ...) und sowohl offline als auch online gibt es zwei Aufrufmöglichkeiten (nenne ich scharf und testinstanz).

Es hat einfach genervt ständig darauf zu achten, dass beim Upload einer neuen Version und der darauf folgenden htaccess-Anpassung nicht ausversehen zu schnell scharf geschaltet wird ohne dass damit über die testinstanz getestet wurde oder alternativ das schon beschriebene Problem auftrat, da wegen der für den Offline-Server notwendigen Auskommentierung des AddHandlers gleich das ganze php-Parsing flöten geht.

Meine heutige Lösung ist zwar auch nicht so richtig professionell, dafür fällt die manuelle Abarbeitung weg. Nun kann über eine Backendfunktion per Formular geändert werden und die htaccess wird nicht mehr per FTP verschoben. Die Unterschiede on-/offline liegen erstmal nur in der Auskommentierung des AddHandlers.

Und hier könnte es auch für andere interessant werden, wenn auch nicht aus dem selben Grundproblem heraus:
Ich wollte darauf verzichten darauf angewiesen zu sein, dass sich die formularmäßig anzupassenden Zeilen (das könnte wie gesagt so ziemlich alles sein) in einer bestimmten Zeilennummer oder hinter einer bestimmten Kommentarzeile befinden.
Code:
RewriteRule ^blabla/(.*)$ version_56/$1 [L]  #-> Test A: version_ E: /$1
RewriteRule ^(.*)$          version_55/$1 [L]  #-> Scharf A: version_ E: /$1
...
AddHandler php-5.3 .php
Die htaccess wird dann zeilenweise eingelesen und jede Zeile per Regex auf die obige Struktur untersucht. Als Gesamt-Rückmeldung erhalte ich dann das Äquvalent zu
PHP:
$versionen = array(
 'Test'   => 56
,'Scharf' => 55
);

Die Speicherung läuft auf ähnlichem Weg mit diversen Prüfungen (welche Ordner sind überhaupt vorhanden, passt der Weichenname, ist die htaccess schreibbar, ..). Ist zwar insgesamt vielleicht etwas übertrieben, aber mir hilft es enorm weiter.