File iobroker.apache.conf of Package iobroker

# Folgende Module müssen in Apache mindestens installiert und aktiviert sein:
# - ssl
# - proxy
# - rewrite
# - proxy_wstunnel
# - mpm_prefork
# - mod_auth_basic
# - mod_authn_file  -- oder andere Authentifizierungsquelle
# 
# Alle Einträge in eckigen Klammern [] sind durch die eigenen Daten zu ersetzen.
#
# Die Berechtigungsprüfung erfolgt durch Apache mittels HTTP-Basic Authentication oder Parameter an der URL.  Dies hat den Vorteil, das unberechtigte Anfragen erst gar nicht zu den Systemen gelangen.
# Da die Verbindung mit SSL/TLS gesichert ist, ist basic-Authentication vollständig ausreichend und am schnellsten. 
# In den lokalen Systemen ist die Authentifizierung auszuschalten, da die Authentifizierungsdaten nicht durchgereicht werden.
# Die Skripte gehen davon aus, dass die lokalen Systeme mittels http angesprochen werden. Falls nicht, müssen die Zeilen entsprechend angepasst werden.

<IfDefine IOBROKER>

# Folgender Teil ist nur erforderlich, wenn man einen lokalen Bereich auf dem Webserver haben möchte, der unter der gleichen URL erreichbar ist (z.B. um statische Daten abzulegen) und bei dem ein Caching durch den Webserver erfolgen soll.
<IfModule mod_cache.c>
    LoadModule cache_disk_module modules/mod_cache_disk.so
    <IfModule mod_cache_disk.c>
        CacheRoot "/var/cache/apache2"
        CacheEnable disk  "/"
        CacheDirLevels 5
        CacheDirLength 3
    </IfModule>

    # When acting as a proxy, don't cache the list
    CacheDisable "/ccu/"
    CacheDisable "/vis/"
    CacheDisable "/iobroker/"
    CacheDisable "/node-red/"
</IfModule>




# Oberste Modul-Deklaration für den kompletten durch ssl gesicherten Service
<IfModule mod_ssl.c>
   # Festlegung des Ports, über den der Server erreichbar sein soll.
   <VirtualHost _default_:443>

      ServerAdmin [ Email des Administrators (Optional)]
      ServerName [ Externe URL des Servers ohne Protokoll, z.B.  haus.meineurl.de] 

      # Stammverzeichnis des Webservers für lokale Inhalte
      DocumentRoot /srv/iobroker

        # Festlegung der Eigenschaften für das Root-Directory auf dem Webserver und alle Unterverzeichnisse
      <Directory />
         Options FollowSymLinks
         AllowOverride None

            # Festlegung der Authentifizierungseigenschaften 
         # Hier wird basic-Authentification mit Liste der berechtigten User konfiguriert.
         # Anleitung zur Konfiguration von Benutzern siehe https://httpd.apache.org/docs/current/howto/auth.html
         AuthType basic
         AuthName "home"
         AuthBasicProvider file
         AuthUserFile /etc/apache2/htpasswd.iobroker

         # Festlegung, dass die Authentifizierung erfordlich ist. Speziell für die App kann kein Basic-Authentication verwendet werden, da diese Teile im Protokoll nicht enthalten sind.
         # Für die App kann alternativ auf die dort angegeben Daten für User und Password geprüft werden. Diese Werte werden in der URL als Parameter übertragen.
         # Die Werte werden nicht aus der Passwort-Datei ausgelesen sondern müssen hier statisch konfiguriert werden. 
         # Wichtig: Nur der erste Request muss beim Öffnen der Verbindung authentifizieren. 
         # Alle nachfolgenden Request über die gleiche http-Verbindung verwenden automatisch die gleichen Credentials. Deswegen ist beim Zugriff auf VIS die http-Authentifizierung für index.html ausreichend.
         <RequireAny>
            # Zugriff über URL-Authentifizierung
            <IfModule mod_authz_core.c>
               <RequireAll> 
                  # Erlaubt auch noch die Einschänkung auf andere Eigenschaften
                  Require expr %{QUERY_STRING} =~ /user=[ Benutzername in der APP ]&pass=[ Passwort in der APP ]/
               </RequireAll>
            </IfModule>
               # Für alle anderen Zugriffe ist http-Authentifizierung erforderlich  
            Require valid-user
         </RequireAny>
      </Directory>

        # Eintrag falls noch lokale Scripte wie z.B. PHP unterstützt werden sollen (muss natürlich getrennt installiert und eingerichtet werden)
      ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
      <Directory "/usr/lib/cgi-bin">
         AllowOverride None
         Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
         <IfModule mod_authz_core.c>
            Require all granted
         </IfModule>
         <IfModule !mod_authz_core.c>
            Order allow,deny
            Allow from all
         </IfModule>
      </Directory>

      # Einrichtung der Zertifikate für die Verschlüsselung
      # Weitere Informationen siehe z.B. https://thomas-leister.de/apache2-webserver-ssl-verschluesselte-verbindungen-ermoeglichen/
      SSLCertificateFile /etc/apache2/ssl.crt/[ Name der Zertifikatdatei ].crt
      SSLCertificateKeyFile /etc/apache2/ssl.key/[ Name der Datei mit dem privaten Schnlüssel ].key
      SSLCertificateChainFile /etc/apache2/ssl.csr/[ evtl Name der Datei mit der Key Chain bis zum Root-Zertifikat ].csr

      
      
      # Rewrite-Regeln
      # Wichtig: Bei den nachfolgenden Mod-Proxy-Einträgen ist die Reihenfolge relevant. Die Auswertung erfolgt von oben nach unten. Das erste passende ProxyPass-Statement gilt.
      
      
        # Weiterleitung für Node-Red
      # Wichtig: Damit die Websocket-Verbindung korrekt weitergeleitet werden kann, muss in den Adapter-Einstellungen von Node-Red in "http root directory" "node-red" eingetragen werden.
      # Ohne Websocket-Verbindung kann man trotzdem auf die IDE zugreifen, bekommt jedoch keine Debug-Information angezeigt.
      # Der Zugriff auf Node-erfolgt dann intern http://[ interne IP ]:1880/node-red und extern über https://[ externe URL ]/node-red
      <IfModule mod_proxy.c> 
         RewriteEngine On 
         redirectmatch ^/node-red$ /node-red/
         
         # Spezieller Eintrag für websocket-Verbindung
         RewriteCond %{REQUEST_URI} ^/node-red/comms [NC] 
         RewriteRule /(.*) ws://[ interne IP ]:1880/$1 [P,L] 
         
         ProxyPass /node-red/ http://[ interne IP ]:1880/node-red/ 
         ProxyPassReverse /node-red/ http://[ interne IP ]:1880/node-red/
      </IfModule>

      # Prototyp für Foscam Webcam
      # Der Zugriff auf die Webcam dann extern über https://[ externe URL ]/video1

      <IfModule mod_proxy.c>
         ProxyRequests off
         RewriteEngine On
         redirectmatch ^/video1$ /video1/
         rewritecond %{REQUEST_URI} ^/video1/
         rewriterule (.*) $1 [PT]

         # Referer Auswertung, falls eine lokale absolute Referenz auf den Seiten ist. In diesem Fall wird /video1 ergänzt, damit ProxyPass matched.
         rewritecond %{HTTP_REFERER} https://[ externe URL ]/video1/ 
         rewriterule ^/(.*) /video1/$1 [PT]
         
         ProxyPass /video1/ http://[ interne IP ]/
         ProxyPassReverse /video1/ http://[ interne IP ]/
      </IfModule>

      
      # Rewrite-Regeln für Homematic CCU 
      # Stammt ursprünglich aus Homematic Forum
      # Der Zugriff auf die CCU efolgt intern weiterhin über http://[ interne IP ] und extern über https://[ externe URL ]/ccu

      <IfModule mod_proxy.c>
         ProxyRequests off
         RewriteEngine On
         redirectmatch ^/ccu$ /ccu/
         rewritecond %{REQUEST_URI} ^/ccu/
         rewriterule (.*) $1 [PT]

         # Referer Auswertung, falls eine lokale absolute Referenz auf den Seiten ist. In diesem Fall wird /ccu ergänzt, damit ProxyPass matched.
         rewritecond %{HTTP_REFERER} https://[ externe URL ]/ccu/ [OR]
         rewritecond %{HTTP_REFERER} https://[ externe URL ]/webui/ [OR]
         rewritecond %{HTTP_REFERER} https://[ externe URL ]/pda/ [OR]
         rewritecond %{HTTP_REFERER} https://[ externe URL ]/api/ [OR]
         rewritecond %{HTTP_REFERER} https://[ externe URL ]/addons/xmlapi/ [OR]
         rewritecond %{HTTP_REFERER} https://[ externe URL ]/addons/cuxd/
         rewritecond %{HTTP_REFERER} \?sid\=\@.+\@ [OR]
         rewritecond %{THE_REQUEST} \?sid\=\@.+\@
         rewriterule ^/(.*) /ccu/$1 [PT]
         rewriterule ^/pda/(.*) /ccu/pda/$1
         rewriterule ^/webui/(.*) /ccu/webui/$1
         rewriterule ^/addons/db/(.*) /ccu/addons/db/$1
         rewriterule ^/addons/xmlapi/(.*) /ccu/addons/xmlapi/$1
         rewriterule ^/addons/cuxd/(.*) /ccu/addons/cuxd/$1
         ProxyPass /ccu/ http://[ interne IP ]/ timeout=1200
         ProxyPassReverse /ccu/ http://[ interne IP ]/ timeout=1200
      </IfModule>


      # Rewrite-Regeln für ioBroker Admin
      # ToDo: Websocket-Kommunikation für Parameter in den Einstellungen fehlt.
      # Der Zugriff auf die Admin-Seite efolgt intern weiterhin über http://[ interne IP ]:8081 und extern über https://[ externe URL ]/iobroker
      <IfModule mod_proxy.c>
         ProxyRequests off
         RewriteEngine On
         redirectmatch ^/iobroker$ /iobroker/
         rewritecond %{REQUEST_URI} ^/iobroker/
         rewriterule (.*) $1 [PT]
         rewritecond %{HTTP_REFERER} https://[ externe URL ]/iobroker/
         rewriterule ^/(.*) /iobroker/$1 [PT]

         ProxyPass /iobroker/ http://[ interne IP ]:8081/ timeout=1200
         ProxyPassReverse /iobroker/ http://[ interne IP ]:8081/ timeout=1200
      </IfModule>

      # Rewrite-Regeln für ioBroker VIS
      # Die socket.io-Kommunikation und der Zugriff auf /lib wird nachfolgend getrennt geregelt (geht bestimmt auch einfacher hier lokal)
      # Wichtig: Im web-Adapter mit "Socket.IO Instance" auf integriert stehen.
      # Der Zugriff auf die Admin-Seite efolgt intern weiterhin über http://[ interne IP ]:8082/vis/index.html und extern über https://[ externe URL ]/vis/vis/index.html. 
      <IfModule mod_proxy.c>
         ProxyRequests off
         RewriteEngine On
         redirectmatch ^/vis$ /vis/
         rewritecond %{REQUEST_URI} ^/vis/
         rewriterule (.*) $1 [PT]

         # Referer Auswertung, falls eine lokale absolute Referenz auf den Seiten ist. In diesem Fall wird /vis ergänzt, damit ProxyPass matched.
         # Referenzen auf node-red, static und socket.io werden explizit ausgeschlossen.
         rewritecond %{HTTP_REFERER} https://[ externe URL ]/vis/
         rewritecond %{REQUEST_URI} !^/node-red/
         rewritecond %{REQUEST_URI} !^/static/
         rewritecond %{REQUEST_URI} !^/socket.io/
         rewriterule ^/(.*) /vis/$1 [PT]
         
         ProxyPass /vis/ http://[ interne IP ]:8082/ timeout=10
         ProxyPassReverse /vis/ http://[ interne IP ]:8082/ timeout=10 
         </IfModule>

      # Rewrite-Regeln für einen direkten Zugriff auf das Verzeichnis /lib des Web-Servers von ioBroker VIS ohne Referer
      # Dürfte normalerweise nicht benötigt werden.
      <IfModule mod_proxy.c>
         ProxyRequests off
         RewriteEngine On
         redirectmatch ^/lib$ /lib/
         rewritecond %{REQUEST_URI} ^/lib/
         rewriterule (.*) $1 [PT]
         ProxyPass /lib/ http://[ interne IP ]:8082/lib/ timeout=10
         ProxyPassReverse /lib/ http://[ interne IP ]:8082/lib/ timeout=10
      </IfModule>


      # Rewrite-Regeln für einen direkten Zugriff auf auf flot ohne VIS
      <IfModule mod_proxy.c>
         ProxyRequests off
         RewriteEngine On
         redirectmatch ^/flot$ /flot/
         rewritecond %{REQUEST_URI} ^/flot/
         rewriterule (.*) $1 [PT]
         ProxyPass /flot/ http://[ interne IP ]/flot/ timeout=10
         ProxyPassReverse /flot/ http://[ interne IP ]:8082/flot/ timeout=10
      </IfModule>

      # Rewrite-Regeln für einen direkten Zugriff auf auf rickshaw ohne VIS
      <IfModule mod_proxy.c>
         ProxyRequests off
         RewriteEngine On
         redirectmatch ^/rickshaw$ /rickshaw/
         rewritecond %{REQUEST_URI} ^/rickshaw/
         rewriterule (.*) $1 [PT]
         ProxyPass /rickshaw/ http://[ interne IP ]:8082/rickshaw/ timeout=10
         ProxyPassReverse /rickshaw/ http://[ interne IP ]/rickshaw/ timeout=10
      </IfModule>


      # Rewrite-Regeln für die socket.io Websocket-Verbindung von VIS und APP
      # Wichtig: Da socket.io im Webadapter auf intern steht, sollte hier auch auf den Web-Adapter und nicht auf einen separaten socket.io-Adapter referenziert werden.
      # Setzt externes WSS (Verschlüsselte Websocket-Verbindung) auf internen WS (ohne SSL/TLS) um.
      <IfModule mod_proxy.c>
         RewriteEngine On 
         Redirectmatch ^/socket.io$ /socket.io/
         RewriteCond %{REQUEST_URI} ^/socket.io/ 
         RewriteCond %{QUERY_STRING} transport=websocket
         RewriteRule ^/(.*) /wss/$1 [PT]
         ProxyPass /wss/ ws://[ interne IP ]:8082/ timeout=1200 Keepalive=On
         #ProxyPassReverse / ws://[ interne IP ]:8082/
      </IfModule>

      # Rewrite-Regeln für die Datei _socket im Hauptverzeichnis vom Web-Server
      <IfModule mod_proxy.c>
         ProxyRequests off
         RewriteEngine On
         Redirectmatch ^/_socket$ /_socket/
         RewriteCond %{REQUEST_URI} ^/_socket/

         RewriteRule (.*) $1 [PT]
         ProxyPass /_socket/ http://[ interne IP ]:8082/_socket/
         ProxyPassReverse /_socket http://[ interne IP ]:8082/_socket/
      </IfModule>

      # Rewrite-Regeln für die socket.io Verbindung im Polling-Modus über HTTPS von VIS und APP
      # Wichtig: Da socket.io im Webadapter auf intern steht, sollte hier auch auf den Web-Adapter und nicht auf einen separaten socket.io-Adapter referenziert werden.
      <IfModule mod_proxy.c>
         ProxyRequests off
         RewriteEngine On
         Redirectmatch ^/socket.io$ /socket.io/
         RewriteCond %{REQUEST_URI} ^/socket.io/
         RewriteCond %{QUERY_STRING} transport=polling
         RewriteRule (.*) $1 [PT]

         ProxyPass /socket.io/ http://[ interne IP ]:8082/socket.io/
         ProxyPassReverse /socket.io/ http://[ interne IP ]:8082/socket.io/
      </IfModule>


      # Parameter für die Steuerung der Log-Ausgabe beim Rewrite
      # Die Logausgabe kann durch Entfernen der # aktiviert werden
      #LogLevel warn 
      #LogLevel alert rewrite:trace8
      #CustomLog ${APACHE_LOG_DIR}/ssl_access2.log combined 

      # Generelles Anschalten von SSL
      SSLEngine on 


      # Sonderregeln für Scripte
      <FilesMatch "\.(shtml|phtml|php)$">
         SSLOptions +StdEnvVars 
      </FilesMatch> 
      <Directory /usr/lib/cgi-bin> 
         SSLOptions +StdEnvVars 
      </Directory> 
   </VirtualHost>
</IfModule>

</IfDefine>
openSUSE Build Service is sponsored by