Verständnisfrage zu PHP nit freetz erstellt // internal Server Error

ickster80

Neuer User
Mitglied seit
17 Jul 2009
Beiträge
16
Punkte für Reaktionen
0
Punkte
1
Hallo,

ich habe mir gemäß dem Wiki auf http://freetz.org/wiki/packages/apache für die Fritzbox den Apache gebaut.
Der läuft soweit.

Mein Ziel ist mich in PHP und CGI-Scripts einzuarbeiten.

Freetz hat mir 2 Binaries erstell php und php-cgi. Die hab ich in den CGI-bin Ordner des Apachen gesteckt.

Ich hatte in der apache2.conf folgendes eingertragen:
Code:
    ScriptAlias /cgi-bin "/var/media/ftp/apache/usr/share/cgi-bin"
Action  php-script      /cgi-bin/php
AddHandler      php-script      .php

Der Aufruf einer einfachen Seite mit <?php phpinfo(); ?> brachte mir immer einen internal Server Error.
Nach ewig langem hin und her habe ich dann mal die Infos von ./php -? angeschaut und auf die Option -f <file> Parse and execute <file>. gestoßen unde habe einfach mal die test.php durchlaufen lassen mit
Code:
./php -f ../htdocs/test.php >test.html
kommt so etwas heraus
Code:
PHP Version => 5.5.30

System => Linux fritz.box 2.6.32.61 #1 SMP Fri Apr 24 16:53:38 CEST 2015 mips
Build Date => Dec  7 2015 20:06:55
Configure Command =>  './configure'  '--cache-file=/home/icke/Schreibtisch/freetz-trunk/source/target-mips_gcc-4.8.5_uClibc-0.9.33.2-nptl/config.cache' '--target=mips-linux' '--host=mips-linux' '--build=x86_64-pc-linux-gnu' '--program-prefix=' '--program-suffix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--datadir=/usr/share' '--includedir=/usr/include' '--infodir=/usr/share/info' '--libdir=/usr/lib' '--libexecdir=/usr/lib' '--localstatedir=/var' '--mandir=/usr/share/man' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--with-gnu-ld' '--disable-nls' '--with-pcre-regex=/home/icke/Schreibtisch/freetz-trunk/toolchain/build/mips_gcc-4.8.5_uClibc-0.9.33.2-nptl/mips-linux-uclibc/usr' '--enable-cli' '--enable-fileinfo' '--disable-ftp' '--without-iconv' '--disable-json' '--with-libxml-dir=/home/icke/Schreibtisch/freetz-trunk/toolchain/build/mips_gcc-4.8.5_uClibc-0.9.33.2-nptl/mips-linux-uclibc/usr' '--without-libexpat-dir' '--enable-xml' '--enable-libxml' '--enable-dom' '--enable-simplexml' '--enable-xmlreader' '--enable-xmlwriter' '--without-mhash' '--disable-memory-limit' '--disable-pcntl' '--disable-session' '--enable-sockets' '--without-sqlite' '--with-sqlite3=/home/icke/Schreibtisch/freetz-trunk/toolchain/build/mips_gcc-4.8.5_uClibc-0.9.33.2-nptl/mips-linux-uclibc/usr' '--with-pdo-sqlite=/home/icke/Schreibtisch/freetz-trunk/toolchain/build/mips_gcc-4.8.5_uClibc-0.9.33.2-nptl/mips-linux-uclibc/usr' '--disable-sysvsem' '--disable-sysvshm' '--disable-sysvmsg' '--with-zlib' '--with-zlib-dir=/home/icke/Schreibtisch/freetz-trunk/toolchain/build/mips_gcc-4.8.5_uCl
u.s.w.

das sieht natürlich nicht nach HTML aus. Verwende ich aber
Code:
./php-[B]cgi[/B] -f ../htdocs/test.php >test.html
wird ein html-file erzeugt.
mit /cgi-bin/php-cgi in der apache2.conf läuft es auch über den Apache bzw. im Browser.


Wo ist mein Denkfehler, bzw. was mache ich falsch. Warum läuft es nicht mit dem PHP-Binary?
Bitte gebt mir einen Tipp
hier meine .conf Anhang anzeigen meinepunktconfig.txt

und die php.ini:
Code:
[PHP]
date.timezone = 'Europe/Berlin'
engine = On
zend.enable_gc = On
short_open_tag = Off
asp_tags = Off
precision = 14
output_buffering = 4096
zlib.output_compression = On
implicit_flush = Off
unserialize_callback_func=
serialize_precision = 17
disable_functions =
disable_classes =
expose_php = Off
max_execution_time = 30
max_input_time = 60
memory_limit = 16M
error_reporting = E_ALL & ~E_DEPRECATED
display_errors = On
display_startup_errors = On
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
variables_order = "GPCS"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
doc_root =
user_dir =
extension_dir = "./"
enable_dl = On
file_uploads = On
upload_tmp_dir = /var/tmp/php
upload_max_filesize = 2M
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
cgi.fix_pathinfo = 1 ;This option is relevant for lighttpd
[Date]
[filter]
[iconv]
[sqlite]
[xmlrpc]
[Pcre]
[mail function]
SMTP = localhost
smtp_port = 25
[SQL]
sql.safe_mode = Off
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[MySQL]
mysql.allow_persistent = On
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port =
mysql.default_socket =
mysql.default_host =
mysql.default_user =
mysql.default_password =
mysql.connect_timeout = 60
mysql.trace_mode = Off
[MySQLi]
mysqli.max_links = -1
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mSQL]
msql.allow_persistent = On
msql.max_persistent = -1
msql.max_links = -1
[PostgresSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[Sybase]
sybase.allow_persistent = On
sybase.max_persistent = -1
sybase.max_links = -1
sybase.min_error_severity = 10
sybase.min_message_severity = 10
sybase.compatability_mode = Off
[bcmath]
bcmath.scale = 0
[browscap]
[Session]
session.save_handler = files
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly = 
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
[MSSQL]
mssql.allow_persistent = On
mssql.max_persistent = -1
mssql.max_links = -1
mssql.min_error_severity = 10
mssql.min_message_severity = 10
mssql.compatability_mode = Off
mssql.secure_connection = Off
[Assertion]
[COM]
[mbstring]
[FrontBase]
[gd]
[exif]
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
 
Zuletzt bearbeitet:
Der korrekte "Handler" für Deinen Typen "php-script" ist "/cgi-bin/php-cgi", solange Du kein PHP-Module für Apache geladen hast.

Ansonsten mußt Du Dich halt mal für eine Aufrufmethode entscheiden (CGI ja/nein, wenn ja, mit speziellem CGI-Binary oder per "SheBang" in der ersten Zeile der Datei oder - wenn nicht als CGI - per Apache-Module) und diese dann einfach umsetzen anstatt zwischen den Varianten zu springen und sie - offensichtlich - durcheinander zu werfen.

Ein Einstieg in die verschiedenen Varianten könnte diese Dokumentation sein: http://php.net/manual/de/security.php, die man auch ernst nehmen sollte, ansonsten ist so ein System über PHP schnell übernommen.

Ein CGI-Skript ist nichts weiter als ein ganz normales Kommando-File, nur daß es ein paar spezielle Environment-Variablen mit Informationen zum HTTP-Request gibt und die Eingabe (stdin) den Request-Body enthält (so einer vorhanden ist), während jede Ausgabe nach stdout an den HTTP-Client übermittelt wird. Ein "allgemeiner" CGI-Server sucht dann anhand der ersten Zeile in so einer Datei nach dem richtigen Interpreter, ein spezieller CGI-Handler kennt i.d.R. schon das richtige aufzurufende Programm und ignoriert ein vorhandenes "SheBang" einfach.
 
Der korrekte "Handler" für Deinen Typen "php-script" ist "/cgi-bin/php-cgi", solange Du kein PHP-Module für Apache geladen hast.

Vielen Dank.
Siehst du da war mein Denkfehler.

Heisst dass, ich müsste den Apache mit mod_php bauen, oder kann ich die php-Binary über die apache2.conf als Modul einbinden?
Der Apache läuft nur im lokalen Netz, ist also nicht nach außen offen. Das wird auch nicht passieren. Deswegen mache ich mir jetzt über die Sicherheitsaspekte keine Sorgen.
 
Zuletzt bearbeitet:
Heisst dass, ich müsste den Apache mit mod_php bauen
Heißt es nicht ... viele Wege führen nach Rom und wenn Du nun schon php-cgi verwenden willst, brauchst Du mod_php nicht ... die Aufrufmöglichkeiten ergänzen sich nicht unbedingt (das meint, die sind nicht gleichzeitig notwendig), die stehen quasi in Konkurrenz zueinander (auch wenn theoretisch alle drei Wege auf demselben Server machbar sind).
 
Moins

Wenn du php-cgi nutzen willst ist diese Ausgabe wichtig...
Code:
/cgi-bin/php-cgi -v
PHP 5.5.6 ([COLOR=#ff0000][B]cgi-fcgi[/B][/COLOR]) (built: Dec  9 2013 14:56:47)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
...und der/die Handler in der apache2.conf
Code:
Action       php-script /cgi-bin/php-cgi 
AddHandler      php-script .php

Für CGI's muss folgende Zeile hinzugefügt/auskommentiert werden:

AddHandler    cgi-script .cgi
Quelle
 
Für CGI's muss folgende Zeile hinzugefügt/auskommentiert werden:

AddHandler cgi-script .cgi]
Ohne Kontext kann das aber auch schnell mißverstanden werden ... der Apache2-Server legt anhand der "extension" einer aufgerufenen Datei (hier eben ".php") mit "AddHandler" einen "Dateityp" fest, der eben nicht direkt in einen Programmaufruf mündet, sondern für eine solche Endung den Inhalt der Datei beschreibt (hier "php-script"). Dieser Typ kann auch mehreren Erweiterungen zugewiesen werden (1:n für typ:extension), bei PHP sind auch die Endungen ".php4" und ".php5" üblich, die würden dann eben auch mit einem "AddHandler"-Statement zu "php-script"-Typen deklariert und für einen solchen Typ wird dann beim Ausliefern der Datei an den Client eben nicht einfach die Datei (also deren Quelltext) vom Webserver geschrieben, es wird stattdessen das mit einem "Action"-Statement definierte Programm aufgerufen (hier gibt es nur eine 1:1-Zuordnung vom Dateityp zum zu verwendenden Programm) und dessen Ausgabe landet am Ende beim anfragenden Client.

Die oben zitierte Bemerkung für CGI's im Allgemeinen gilt also nur dann, wenn man CGI-Skripte mit der Erweiterung ".cgi" auch außerhalb eines explizit für CGI-Skripte (mit einem ScriptAlias-Statement) reservierten Verzeichnisses verwenden will und dann braucht es für ein solches Verzeichnis in der Regel noch den Zusatz "Options ExecCGI", damit die Security-Mechanismen den Aufruf von CGI-Skripten außerhalb eines ScriptAlias-Verzeichnisses überhaupt zulassen.
 
Falls es passt, es gibt einen Patch http://freetz.org/ticket/2551 der Apache2 und PHP5 als ladbares Modul beinhaltet und CGIs wie PHP Scripte ausführen kann.
Dieser Patch enthält ein Freetz Startup-Script, sowie eine Freetz Konfiguration GUI und ein paar Gimmicks wie SSL Certificate, Login Gruppen mit konfigurierbaren Benutzer Passwörten, Logout Script, Freetz Proxy mit doppelten Login Schutz.

Wird derzeit weiter gepflegt unter ​https://github.com/dirk-dhu/freetz.git

Gruß
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.