Apache2, Verzeichnis öffentlich machen
der henry
- apache
- webserver
0 Raketenwilli0 Raketenwilli0 Rolf B
0 Raketenwilli0 der henry0 Raketenwilli0 Rolf B
Hallo,
ich habe einen Webserver am laufen, bei dem ich AuthType basic nutze. Nun möchte ich aber ein einziges Verzeichnis öffentlich machen und darin ein cgi-script von Außen starten.
Ich habe mir zu meiner vhost nachfolgendes hinzugefügt.
<Directory "/srv/www/htdocs/public/*">
AddHandler cgi-script .cgi
Options +Indexes +ExecCGI
Require all granted
</Directory>
... ich kann jetzt auf mein öffentliches Verzeichnis zugreifen, um z.B. ein Bild im Webserver, ohne Authentifizierung, zu sehen.
Wenn ich aber mein cgi-script starten will, wird das cgi-script vom Browser herunter geladen. (Es liegt nicht am cgi-script, dies funktioniert seit Jahren)
Wer hat hier einen Tip.
Vielen Dank !!
der henry
Ich rate mal.
Du hast vergessen in Deiner Server-Konfiguration in der obersten Ebene (Document-Root) ein AllowOverride zu setzen?
DocumentRoot /var/www/html
<Directory "/var/www/html">
Options None
AllowOverride All
</Directory>
<Directory "/var/www/html/special">
Require all granted
Options +Indexes +ExecCGI
AddHandler cgi-script .cgi
</Directory>
Lass mich raten (2)
Du hast
sudo a2enmod cgi; sudo systemctl restart apache2;
vergessen?
Hallo Raketenwilli,
sollte das nicht einen http 500 Code geben?
Rolf
sollte das nicht einen http 500 Code geben?
Kommt drauf an, ob Henry alles gezeigt und/oder den Neustart gemacht hat.
Wenn das
AddHandler cgi-script .cgi
Options +Indexes +ExecCGI
tatsächlich ein:
<IfModule mod_cgid.c>
AddHandler cgi-script .cgi
Options +Indexes +ExecCGI
</IfModule>
ist, dann nicht. Aber wie schon geschrieben, ohne Neustart sind das alles nur „tote“ Texte.
Hier mal meine
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html
<Directory "/var/www/html">
AllowOverride All
<IfModule mod_cgid.c>
AddHandler cgi-script .cgi
Options +Indexes +ExecCGI
</IfModule>
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Hallo,
natürlich habe ich den Server mit "service apache2 restart" immer neu gestartet. Das Modul "a2enmod cgi" hatte ich schon wegen anderer Scripte installiert und aktiviert.
... anbei meine komplette vhost.conf
<VirtualHost *:443>
DocumentRoot /srv/www/htdocs
ServerName Laserprozessor
ServerAdmin info@xyz.de
<Directory /srv/www/htdocs>
AllowOverride All # NEU !!! '
Options +ExecCGI +Includes
AuthType Basic
AuthName "Bitte geben Sie Ihre Authorisierung ein"
AuthUserFile /srv/www/htaccess/.htusers
require valid-user
</Directory>
ScriptAlias /cgi-bin/ /srv/www/cgi-bin/
<Directory /srv/www/cgi-bin>
Options +ExecCGI +Includes
AuthType Basic
AuthName "Bitte geben Sie Ihre Authorisierung ein"
AuthUserFile /srv/www/htaccess/.htusers
require valid-user
</Directory>
SSLCertificateFile /etc/apache2/ssl.crt/fullchain.pem
SSLCertificateKeyFile /etc/apache2/ssl.key/privkey.pem
SSLEngine On
### Es werden alle Dateien (*.html) nach SSI durchsucht
AddType text/html .html
AddHandler server parsed .html
AddOutputFilter Includes .html
# Zugriff Kamera / USV-Software
RewriteEngine on
# RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Kamera 1 ##################################
ProxyPass /kamera_1/ http://192.168.10.71:80/
ProxyPassReverse /kamera_1/ http://192.168.10.71:80/
# Kamera 2 ##################################
ProxyPass /kamera_2/ http://192.168.10.72:80/
ProxyPassReverse /kamera_2/ http://192.168.10.72:80/
#########################################################
# Zugriff auf public-Verzeichnis für "Stückzahl"
#########################################################
<Directory "/srv/www/htdocs/public">
Require all granted
Options +Indexes +ExecCGI
AddHandler cgi-script .cgi
</Directory>
</VirtualHost>
Ein ...
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combinedQuelltext hier
bringt Fehler, kann den apache2 nicht starten.
Ich habe nun in meinen alten Unterlagen gekramt und hatte schon einmal ein "public" Verzeichnis. Hier stand in der serverkonfig noch zusätzlich
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "PUT,GET"
... was aber bei der aktuellen Serverversion einen Fehler verursacht.
Jetzt habe ich eine info.html erstellt in dem das cgi-script aufgerufen wird und siehe da ... es geht
Danach habe ich den Pfad inkl. Port und cgi-namen + Übergabeparameter in die Browserzeile eingegeben ... es geht und der Rückgabewert wird angezeigt
Wiederum danach habe ich die Webseite (anderer Webserver) unter die Lupe genommen, die auf den Webserver (publicverzeichnis) zugreift und mittels "fetch" das script vom entfernten Server aufruft um den Rückgabewert anzuzeigen. Hier kommt beim Aufruf (fetch) eine Fehlermeldung: "NetworkError when attempting to fetch resource" ... die Adresse ist aber 100% richtig.
Webserver 1 (Zentrale) -> Webseite mit javascript holt von den Maschinen-Webservern (2-25 im Internet) über ein cgi-script in deren publicverzeichnis Daten ab.
Eine Maschine hat einen neuen Rechner bekommen, dabei wurde der Webserver mit https aktiviert, alle anderen Maschinen haben noch http Von allen "http Maschinen" können weiterhin Daten abgeholt werden, von der "https Maschine" nicht. Kann dies am fehlenden Zertifikat liegen ... dies habe ich bei direkten Aufruf als sicher eingestuft und akzeptiert.
Jetzt habe ich gelesen, es könnte eventuell mit Firefox und put/get zu tun haben ... ich habe jetzt keine Ahnung mehr, wo ich ansetzen soll/muss.
Vielen Dank für eure Unterstützung
der henry
Moin.
Vorab: Bei „Apache-Fragen“ ist es für die potentiell Helfenden immer wichtig zu wissen, welcher Apache unter welchem OS (auch welches Linux) wie installiert (aus dem Repo, docker, snap, selbst kompiliert, ...? ) installiert wurde. Siehe unten.
... anbei meine komplette vhost.conf
AllowOverride All # NEU !!! '
Das kann jetzt wieder weg, hab ich geschrieben weil ich dachte, Du steuerst das womöglich in einer .htaccess. AllowOverride
steuert, was in einer solchen beachtet oder ignoriert wird…
Ein ...
ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combinedQuelltext hier
bringt Fehler, kann den apache2 nicht starten.
Womöglich läuft Dein Apache nicht unter Debian und es gibt die Debian-typische Datei envvars
nicht in /etc/apache2
. Ersetze die Pfade (z.B. durch /var/log/apache2/error.log
. Poste die Fehlermeldungen. Oder lass es halt weg wenn Du keine speziellen Logfiles brauchst.
Ach so: Wenn/Falls Du da Pfade setzt, dann in dem Verzeichnis, in welches der Apache seine Logfiles „out of the box“ schreibt und lass die Endung „.log“ - sonst musst Du auch noch logrotate anpassen.
Ich habe nun in meinen alten Unterlagen gekramt und hatte schon einmal ein "public" Verzeichnis. Hier stand in der serverkonfig noch zusätzlich
Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "PUT,GET"
... was aber bei der aktuellen Serverversion einen Fehler verursacht.
https://httpd.apache.org/docs/current/mod/mod_headers.html
Ist das Apache-Modul mod_headers
eingeschaltet?
Jetzt habe ich eine info.html erstellt in dem das cgi-script aufgerufen wird und siehe da ... es geht
Das hab ich jetzt nicht verstanden.
Danach habe ich den Pfad inkl. Port und cgi-namen + Übergabeparameter in die Browserzeile eingegeben ... es geht und der Rückgabewert wird angezeigt
Wiederum danach habe ich die Webseite (anderer Webserver) unter die Lupe genommen, die auf den Webserver (publicverzeichnis) zugreift und mittels "fetch" das script vom entfernten Server aufruft um den Rückgabewert anzuzeigen. Hier kommt beim Aufruf (fetch) eine Fehlermeldung: "NetworkError when attempting to fetch resource" ... die Adresse ist aber 100% richtig.
Verstehe ich das richtig:
Du hast statisches HTML, darin Javasript, das „telefoniert“ zu unterschiedlichen Servern und holt anhand einer dynamischen (zur Laufzeit zusammengebauten) Adresse die Ausgaben des cgi-Skriptes ab?
fetch
hat - soweit ich das weiß und das MDN das beschreibt - keine Methode oder Setting mit dem man einen ungültigen Server-Key übergehen kann.
Lösung: Dein Server sollte keine selbst signierten Keys anbieten. Eine Lösung ist: Konfiguriere und benutze Let's Encypt.
Hallo Henry,
mit Apache kenne ich mich nicht so aus, aber mir fällt was anderes auf: http/https.
Das Protokoll gehört zum Origin der URL, d.h. wenn Du mit JavaScript von http://example.org aus etwas von https://examle.org lesen willst, ist das ein Cross-Origin Zugriff, der durch entsprechende CORS-Header genehmigt sein muss, damit der Browser ihn nicht verhindert.
Header set Access-Control-Allow-Origin "*"
ist sozusagen der Freifahrtschein dafür.
HTTPS an sich sollte nicht so kritisch sein; von einer HTTP-Seite aus eine HTTPS-Ressource zu lesen ist erlaubt, von HTTPS aus HTTP zu Lesen hingegen nicht.
Access-Control-Allow-Methods brauchst Du nur für PUT, weil GET, POST und HEAD immer erlaubt sind (sagt MDN). Brauchst Du PUT? Machst Du fetch-Aufrufe mit PUT-Methode?
Rolf
Hallo Raketenwilli, hallo Rolf,
vielen Dank für eure Unterstützung. Fehler war ... wie schon so oft ... das Modul headers war/wurde nicht automatisch geladen.
Als dies geladen habe konnte ich die Zeile
Header set Access-Control-Allow-Origin "*"
aktivieren und es läuft.
Vielen Dank nochmals an euch zwei ...
Ich werde mich bei Zeiten einmal mit Let's Encypt befassen.
Gruß
der henry
Ich werde mich bei Zeiten einmal mit Let's Encypt befassen.
Eigentlich muss man nur certbot
installieren (und zuvor dafür sorgen, dass der Hostname im Internet zu seiner IP auflösbar ist und natürlich, dass dieser aus dem Internet auf Ports 80 und 443 (TCP) erreichbar ist.