Knobelaufgabe: File direkt nach Header includen...

  • Thread starter Thread starter server4downs
  • Start date Start date
S

server4downs

Guest
Hallo zusammen,

ich komme mal wieder mit einer komplizierten Frage:
Ich habe gestern schon mehrere Stunden versucht via mod_layout eine PHP-Datei vor jedes html oder php file einzufügen.
Mod_layout (4.x.x Apache2) will den Kram jedoch immer in <body></body>. Clever wie ich war hab ich da einfach was an den header-files von mod_layout rumgeschraubt, dass es nun immer vor <html> schreibt.
So weit, so gut dachte ich mir. Doch logisch genug hatte ich nicht gedacht... :P
Viele Files haben ja z.B.
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
oben stehen.
Das macht sich dann schlecht, wenn das inkludierte File zwischen
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
und
HTML:
<html>
ausspuckt!
auto_prepend_file von PHP 'wäre' die perfekte Lösung. Jedoch bleibt die Betohnung auf 'wäre', denn es geht nicht so einfach, wie man sich das vorstellt, denn das inkludierte PHP-File spuckt etwas aus, was dann bedeutet, dass die header schon gesendet sind und viele PHP-Functions somit nicht mehr funktionieren (lovely error-msg: "Headers already sent...").

Ist die Problematik klar?
Würde mich über Vorschläge zur Lösung oder auch Umgehung des Problems freuen.
 
server4downs said:
Clever wie ich war hab ich da einfach was an den header-files von mod_layout rumgeschraubt, dass es nun immer vor <html> schreibt.
Wo soll den der Output genau hin?
Und was ist es für ein Output?
Denn vor DOCTYPE sollte eigendlich nichts stehen.

huschi.
 
Ein JavaScript-Output, der die Seite Framen soll (gezwungen). Ähnlich wie bei Tripod ;)
Tripod hat wahrsch. an den PHP-header-Files geschraubt, weil die machen es glaub mit prepend_file
 
Last edited by a moderator:
Aber ich sehe es schon kommen, irgendwo scheitern auch die Besten vom SSF :)
Ich werde mich wohl oder übel an den Source von PHP dranmachen müssen :p
Wenn es was wird, werde ich die angepasste Version natürlich veröffentlichen.
 
Ich würde ja Helfen aber drücke dich mal mit Beispielen aus :)
Kanns mir Bildlich nicht vorstellen oder es ist einfach noch viel zu früh
 
Ja dann, ok ;)
Also:
Jeder kennt doch die Einstellung in der php.ini auto_prepend_file, auto_append_file (kann auch mit Apache gesetzt werden).
auto_append_file hängt die angegebene Datei an jedes PHP-Document an.
auto_prepend_file macht genau das Gegenteil: es klebt die angegebene Datei ganz oben an jedes PHP-Dokument.
Einziger Nachteil hier:
Da diese Datei, die vorne hingemacht wird einen Output hat, kann dann im PHP-File keine header-function mehr benutzt werden, dies endet dann nur in "Headers already sent".
So gesehen "included" PHP ein bisschen zu früh, da danach kein Eingriff auf die header mehr möglich ist.
Ich brauche aber unbedingt irgendetwas, mit dem ich vom Ergebnis her genau erziele, was auto_prepend_file macht. D.h. ich habe eine Datei, nennen wir sie prepend.php und diese soll jetzt vor jedem Aufruf eines PHP-Files ausgeführt werden und der Output dieser prepend.php soll ganz oben (am Anfang) des PHP-Files stehen.
Ok, damit ich ein besseres Beispiel liefern kann:
Hiermit soll Werbung erzwungen werden. Prepend.php erhält eine JScript-Anweisung, die ganz am Anfang jedes Dokuments stehen soll und die Site dann automatisch framed und uns einen Werbe-Frame ermöglicht.
Ähnlich wie bei Tripod.
Ist es nun klar?
Wir müssen einfach irgendwie an den Anfang jedes Files was hinklatschen können, praktisch vor dem stuff vom User.

So, mehr kann ich nicht mehr erklären. Bin noch zu müde :)
 
Schon mal an einen output-Filter von Apache2 gedacht?
(Es wundert mich eh, daß Du dauernd nur von php-Scripten sprichst, und nicht von html-Seiten.)

Ein eigener output-Filter bekommt IMHO den vollständigen Output des Scipts über die STDIN und kann ein beliebiges (CLI-)Programm sein (C, Perl, PHP-cli).

D.h. die Scripte arbeiten wie gewohnt und der Filter braucht dann seine Ausgabe nur zwischen Header und Body (erkennbar an einer leeren Zeile) des Response zu hängen.

huschi.
 
Irgendwie hat das leider auch nicht geholfen :p
Also, um es nochmals darzustellen:
Wir haben nun die Anzahl x (x für unbestimmt) an Virtualhosts.
Da jeder User (dem jeweils ein vhost zusteht) im Durchschnitt sagen wir mal 50HTML oder PHP-Files (die HTML ausgeben) hat macht es keinen Sinn jedes File des Users zu bearbeiten und vor <html> (eben am Anfang des Files) unseren Werbecode hinzukritseln.
Ich denke, soweit sollte es verstanden worden sein, oder?
Deshalb will ich, dass einfach automatisch ein gewisses File (sollte eher PHP sein) bei jedem Aufruf über den Webserver VOR dem eigentlichen File geparst wird.
Grundsätzlicher Vorgang wie bei auto_prepend_file.
Auto_prepend_file kann aus oben genannten Gründen aber nicht verwendet werden.
mod_layout kann man leider vergessen, da ich es zwar hingekommen hbae, dieses soweit anzupassen, jedoch spuckt dieses dann unter anderen seltsame Zeichen aus und übermimmt einfach irgendwelche Textausschnitte von anderen Vhosts.
Ist das denn so schwer zu verstehen?
Ich suche einfach nach einer Alternative zu mod_layout und auto_prepend_file!
Tripod hat dies doch auch irgendwie geschafft!
 
server4downs said:
Irgendwie hat das leider auch nicht geholfen :p
Kannst Du spezifizieren, warum nicht?

Denn schau mal:
Code:
Client --- request ---> Apache
   ^                      |
   |                   mod_php
   |                      |
   +-- respose --- Apache_outputfilter
Wenn also der Outputfilter nicht das ist, was Du suchst, dann ist Dir nicht mehr zu helfen. Der erhält doch sogar den vollständigen Header und kann daher sogar zwischen Bildern, PDFs und HTML unterscheiden.

huschi.
 
Meine Idee wäre, die Ausgabepufferung bei PHP per default zu aktivieren. Dann kannst du die PHP-Funktionen nutzen, um die Header davorzuschreiben, gleichzeitig musst du aber nicht auf header() verzichten.
 
Vielen vielen Dank, dies hat mir den Anstoß gegeben.
Ich habe es nun mit ob_start() im prepend-file gelöst. Funktioniert ausgezeichnet!
Geschwindigkeit passt auch.

@Huschi:
bitte fühle dich nicht angegriffen, wegen meinem letzten etwas "genervten" Posting, war da gerade etwas launisch.
Jedoch war mir diese Lösung irgendwie doch zu kompliziert. Außerdem soll sie recht langsam sein (laut versch. Aussagen).

Vielen Dank. Ich wusste es doch. Es gibt kein Problem, was nicht gelöst werden kann.
 
server4downs said:
Vielen vielen Dank, dies hat mir den Anstoß gegeben.
Ich habe es nun mit ob_start() im prepend-file gelöst. Funktioniert ausgezeichnet!
Geschwindigkeit passt auch.
Ich meinte eigentlich die php.ini-Option output_buffering, mit der wär das ganze vielleicht etwas einfacher gewesen. ;)
 
hoffie said:
Ich meinte eigentlich die php.ini-Option output_buffering, mit der wär das ganze vielleicht etwas einfacher gewesen. ;)
Einfach nicht. Ist doch wurscht, ob ich ob_start() oben in mein prepend-file reinhau, oder extra php.ini öffne, änder und neustarte... außerdem wollte ich den Buffer nur für bestimmte hosts ändern, die auch prepend benutzen.
Dein Posting hat mir aber den Denkanstoß gegeben.
 
moin,

habe ähnliches vor.
Soweit ich das hier heraus lesen konnte funktioniert die Variante ja nur mit PHP Files,
gibt es für HTML Files nur die Variante über den Outputfilter?
 
StickyBit said:
Soweit ich das hier heraus lesen konnte funktioniert die Variante ja nur mit PHP Files, gibt es für HTML Files nur die Variante über den Outputfilter?
Ich glaube, daß kann ich mit einem klaren 'ja' beantworten.

huschi.
 
Back
Top