mark: Apache: virtual Host ohne virtual Host?

Hallo zusammen,

ich habe lokal einen Apache und verschiedene Bash-Scripts, welche mir meine Code−Snippets, Wikis, Dokumentationen von verschiedenen Quellen (Markdown) Gitlab, Github, DevOps als Html rendert und durchsuchbar macht und diese auch automatisch aktualisiert.

Auch die Ordner-Struktur wird automatisch angelegt:

Document Root
|- dir-listing-style.css
|- "snippets repository A"
|- "wiki repository B"
|- "code repository C"

Im Apache Document-root-Verzeichnis findet sich nur eine css-Datei, welche für das stylen des Apache directory listing vornimmt. Wenn ich also "localhost" aufrufe bekomme ich eine schöne Übersicht (Directory listing) all meiner Snippets.

Nun habe ich aber das Problem, dass Links in den Makrdown Dateien manchmal absolut sind (mit einem forward slash beginnen). Da ich nur einen virtuellen host (Document-root) habe zeigt dann ein Link von "wiki repository B" auf das Document Root Verzeichnis, anstatt "wiki repository B" als Document root zu verwenden.

Ich habe dieses Problem mit mod-proxy "gelöst", indem ich …

  1. kontrolliere ob es sich um einen lokalen Link handelt
  2. dann vergleiche ich Referrer mit dem Ziel des Links
  3. kontrolliere, ob dem Link die erste Subdirectory des Referrers fehlt (z.b.: "wiki repository B")
  4. wenn alles zutrifft setze ich die Subdirectory in den Link ein und leite die Anfrage entsprechend um.

Leider habe ich den entsprechenden Abschnitt meiner Apache Konfiguration gerade nicht zur Hand, dass ich euch dieses Ungetüm zeigen könnte 😉 Diese Lösung funktioniert, scheint mir aber sehr "hacky" in Bezug auf Wartbarkeit. Irgendetwas sagt mir, dass ich das nicht so machen sollte.

Die saubere Lösung, die mir eingefallen ist, wäre für jedes Repository, das ich ziehe einen eigenen, Port-basierten virtual-Host anzulegen. Das würde mein bash script abermals um ein gehöriges Stück erweitern und verkomplizieren. Ich gestehe, im Entwicklungsprozess hatte ich irgendwann keinen Bock mehr auf Bash 😀

Ich würde das dann so machen, dass ich Apache einen gewissen Port-Bereich definiere, welcher dann bei jedem neuen Repository inkrementiert wird. Und die sonstigen Einstellungen (z.B. Document root) setze ich dann mit sed.

Bevor ich das jedoch mache habe ich mit gedacht, ich frag' sicherheitshalber hier nach, ob es nicht eine bessere/einfachere Möglichkeit gibt absolute links ohne Virtuellen Host in ein Unterverzeichnis einzusperren? Oder, ob mir jemand tools empfehlen kann die mir das Anlegen von virtuellen hosts (konkret das rum-sedden in Bash) abnehmen. Irgend ein Kommandozeilen-Tool, das mir das abnimmt?

Danke derweil

mark

P.S.: Falls das von Relevanz ist, ich brauche auch nicht unbedingt apache. Es handelt sich um statische HTML-Seiten. Lighttpd, o.ä. wäre auch eine Möglichkeit.

  1. Hallo mark,

    das klingt nach einem ordentlichen Projekt, das Du da laufen hast 😀

    Ich bin - wie schon mehrfach geschrieben - kein Indianer, aber wenn ich die Apache-Doku richtig verstehe musst Du für jede Quelle, die Du da hast, entsprechende If und PassMatch Direktiven bauen. Das ist sicherlich mühsam.

    Aber verstehe ich das richtig, dass Du ohnehin sämtliche Quellen, die Du bei Dir integrierst, vorverarbeitest? In dem Fall sollte es doch möglich sein, absolute Links an dieser Stelle zu erkennen und sofort mit dem Root-Folder dieses Dokumentationsteils zu prefixen. Damit wäre dann zumindest die Apache-Konfiguration unabhängig von deinen Quellen.

    Schwieriger wird es, wenn deine Quellen nicht nur Links enthalten, sondern auch Referenzen auf weitere Ressourcen (Bilder, CSS, Script 😨), dann hast Du mehr zu parsen als nur href="...". Andererseits ist SED ein mächtiges Tool. Ich würde vermutlich (mangels SED Expertise) statt dessen meinen C# Compiler dafür anwerfen.

    Mal so ins Unreine gesponnen - eine Alternative könnte JavaScript sein. Wenn Du deine Doku-Ressourcen als Text in eine MYSQL Datenbank legst und sie über ein JavaScript Frontend anforderst, das deine Quellen per Ajax holt und live als HTML rendert, könnte es sich auch auf das click-Event von Links registrieren und die Übersetzung on-the-fly durchführen (bzw. statt dem Link zu folgen die neue Ressource holen). Aber trivial ist das nicht, du baust einen Teil des Browsers nach. Und die Durchsuchbarkeit würde mittels der Volltextindexierung von MySQL erledigt. Du brauchst dann "nur" einen Serverscript (PHP, Node.JS, Perl, ASP.NET, JSP, whatever), das die Datenbank anspricht. Das wäre vermutlich meine Herangehensweise. Aber ich programmiere auch schon ein paar Jährchen lang...

    Rolf

    --
    sumpsi - posui - clusi
  2. Lieber mark,

    Da ich nur einen virtuellen host (Document-root) habe

    warum? Ist das in Deinem Fall wirklich die beste Lösung? Ich denke nein. Du solltest vielleicht tatsächlich mehrere virtuelle Hosts einrichten, egal ob port- oder namensbasiert (letzteres wäre mein Favorit).

    Was hindert Dich daran, in /etc/hosts entsprechende Domains (passend zu Deinen virtuellen Hostkonfigurationen) einzutragen?

    127.0.0.1 snippets.localhost
    127.0.0.1 wiki.localhost
    127.0.0.1 code.localhost
    

    Liebe Grüße,

    Felix Riesterer.

    1. Hello,

      Da ich nur einen virtuellen host (Document-root) habe

      warum? Ist das in Deinem Fall wirklich die beste Lösung? Ich denke nein. Du solltest vielleicht tatsächlich mehrere virtuelle Hosts einrichten, egal ob port- oder namensbasiert (letzteres wäre mein Favorit).

      Was hindert Dich daran, in /etc/hosts entsprechende Domains (passend zu Deinen virtuellen Hostkonfigurationen) einzutragen?

      127.0.0.1 snippets.localhost
      127.0.0.1 wiki.localhost
      127.0.0.1 code.localhost
      

      Und wenn man nicht jedes Mal ".localhost" tippen will, kann man da auch etwas Kürzeres nehmen ()z. B. ".lan"). Und man kann den einzelnen Domains/ Hosts auch jeweils eigene IPs aus dem 127er Bereich geben. Das ist manchmal ganz praktisch. Ich kenne bisher kein System, das das nicht versteht.

      Glück Auf
      Tom vom Berg

      --
      Es gibt nichts Gutes, außer man tut es!
      Das Leben selbst ist der Sinn.
    2. Hallo Felix,

      vielleicht verstehe ich ja zu wenig davon, aber wenn ich in etc/hosts eintrage, dass bspw. wiki.selfhtml.org auf 127.0.0.1 gemappt werden soll, dann hänge ich mich auf diesem Gerät doch komplett vom Online-Wiki ab, oder? Dieses Mapping sollte nach meinem Verständnis der Problemstellung nur stattfinden, wenn die offline-Doku durchbraust wird. D.h. man bräuchte einen Browser, der mit einer nur in seinem Prozess gültigen etc/hosts Datei unterwegs ist, und ob sowas ohne eine VM (oder einen Docker-Container) möglich ist, das weiß ich nicht.

      Rolf

      --
      sumpsi - posui - clusi
      1. vielleicht verstehe ich ja zu wenig davon, aber wenn ich in etc/hosts eintrage, dass bspw. wiki.selfhtml.org auf 127.0.0.1 gemappt werden soll, dann hänge ich mich auf diesem Gerät doch komplett vom Online-Wiki ab, oder?

        Ja. Aber die IP von "wiki.selfhtml.org" zu verbiegen hatte Felix nicht vorgeschlagen. Da stand "wiki.localhost".

        Dieses Mapping sollte nach meinem Verständnis der Problemstellung nur stattfinden, wenn die offline-Doku durchbraust wird.

        Ich habe den Mark auch so verstanden, dass er sich eine offline-Lösung bastelt. Sowas stellt man doch nicht online - oder?

        1. Hallo ursus,

          ja ok, danke für den Hinweis. Solange die Inhalte nur hostfreie Links enthalten, geht das.

          Sowas stellt man doch nicht online - oder?

          Nein, davon bin ich auch nicht ausgegangen. Das könnte je nach integrierter Quelle sogar zu rechtlichen Problemen führen. Aber angesichts meines Missverständnisses zu absoluten URIs kam ich auf diese Problematik - wenn ich www.selfhtml.org umleiten täte, hängte ich mich ja selbst von der Quelle ab.

          Rolf

          --
          sumpsi - posui - clusi
  3. Evnt. hilft Dir mod_vhost_alias - Apache HTTP Server Version 2.4 weiter, Virtual Document Root. MFG

  4. Irgendetwas sagt mir, dass ich das nicht so machen sollte.

    Was auch immer das ist, ich schließe mich dem an.

    Die Alternative, die Daten mit sed zu bearbeiten, hat Grenzen oder endet womöglich in einem kompletten Parsen, weil vielleicht auch vermeintliche "Pfade zu Ressourcen" auftauchen, die zum Inhalt gehören… Das Parsen scheitert dann vielleicht auch noch an HTML-Fehlern in den Sourcen. Auch die von Rolf erwähnte Idee, da mit Javascript „draufzuhauen“ wird wohl an solche Grenzen stoßen.

    Auch die weitere, mir einfallende Möglichkeit, mit mod_rewrite jeden Zugriff auf einen "router" (z.B. in PHP) umzulenken, der dann die Arbeit macht will mir "nicht wirklich" gefallen, das ist kein "Gnampf" mehr, das ist "Murks".

    Die saubere Lösung, die mir eingefallen ist, wäre für jedes Repository, das ich ziehe einen eigenen, Port-basierten virtual-Host anzulegen.

    Ich bin da ganz bei Felix. Wo ist das Problem, aus einer Vorlage automatisch eine Konfigurationsdatei für einen namensbasierten virtuellen Host zu erzeugen (ein eigener Ordner /etc/apache2/site_templates/ wäre wohl ein idealer Platz dafür) und dem Indianer mit systemctl reload apache2 einen Stubs zu geben, auf dass er diese nunmehr mit beachte und natürlich der Host-Datei (oder der "Datenbank" von bind eine neue Zeile zu spendieren und dann rndc zu bemühen)? Die Startseite auf dem generischen Host automatisch zu bearbeiten ist dann, z.B. mit sed, ebenso ein Kinderspiel. Ersetze einfach einen Platzhalter (Kommentar) durch eine neue Zeile und den Platzhalter… Das alles wäre auch ebenso einfach umzukehren.

    In meinem Augen ist das wesentlich einfacher, in der Anwendung stabiler und überschaubarer als sich ein derart unbeherrschbares Ungetüm zu bauen, welches dann auch darauf angewiesen ist, dass Du den richtigen Referer hast…

  5. Vielen Dank für Eure Antworten/Hilfestellungen.

    Ich versuche das mal kurz zusammenzufassen:

    • meine Methode mit dem Proxy ist wirklich Murks. Das sollte ich nicht so machen.
    • Das ersetzen der Links mit sed, oder Javascript ist fehleranfällig und sollte auch vermieden werden.
    • ich sollte mir die Mühe machen und tatsächlich für jedes Repository einen virtuellen Host anlegen.

    Mit mod_vhost_alias werde ich auch noch ein wenig experimentieren. Das löst zwar nicht das Problem der absoluten Links, könnte aber nützlich sein, um der URL die ich eingebe ein wenig Struktur zu geben.

    Antworten auf Fragen:

    Aber verstehe ich das richtig, dass Du ohnehin sämtliche Quellen, die Du bei Dir integrierst, vorverarbeitest?

    Ja, sämtliche Quellen werden vorverarbeitet. Ich mache aus Markdown -> html. Ich habe bei dem Transformationsprozess auch die Möglichkeit Javascript zu laden, da alle Markdown-Files in ein Handlebar-Template eingebettet werden.

    Wo ist das Problem, aus einer Vorlage automatisch eine Konfigurationsdatei für einen namensbasierten virtuellen Host zu erzeugen (ein eigener Ordner /etc/apache2/site_templates/ wäre wohl ein idealer Platz dafür) und dem Indianer mit systemctl reload apache2 einen Stubs zu geben, auf dass er diese nunmehr mit beachte und natürlich der Host-Datei (oder der "Datenbank" von bind eine neue Zeile zu spendieren und dann rndc zu bemühen)?

    Das Problem hierbei bin ich :) Wie ich mich kenne artet das dann in eine Weboberfläche aus mit der man seine Quellen verwalten kann ... und da fehlte mir die Motivation das auch noch zu basteln. Ich meine ... mein Problem sind ja "NUR" absolute Links und die saubere Lösung hierfür sind automatisiert erstellte virtuelle Hosts und ein automatisiert erstellter Index dieser virtuellen Hosts. Das schien und scheint mir einfach in keinem Verhältnis zu stehen (Aufwand-Nutzen).

    Danke abermals

    Mark