Linuchs: Basis-Verzeichnis zu einer HTML-Datei <base>

Moin,

wenn ich eine HTML Datei aufrufe, möchte ich ein Verzeichnis angeben für die weiteren Dateien wie CSS, IMG, ... Aber <base> funktioniert nicht.

Der Fall:

Ich habe z.T. recht lange URLs und möchte einige verkürzt angeben können.

Zum Beispiel example.com/71 - da es dieses Verzeichnis nicht gibt, wird die Datei example.com/error_404.php befragt. Die erkennt die "71" und veranlasst einen include

include ( "/musik/liedtexte/shantymen_sind_very_good.htm" );

Die Datei wird zwar gezeigt, aber aus der Sicht des Stammverzeichnisses / und damit ohne CSS, denn die darin verlinkte

<link rel=stylesheet  href='css/basis.css'>

steht nicht im Stammverzeichnis, sondern im /musik/liedtexte. Nun habe ich dies eingefügt

...
  <base href="/musik/liedtexte" /><!-- fuer error_404.php -->
  <link rel=stylesheet  href='css/basis.css'>
</head>

Die CSS wird nicht geladen, denn <base> scheint nur Domain-Namen zu mögen und keine Verzeichnisse. Was wäre meine Lösung?

Linuchs

  1. Hallo Linuchs,

    ...
      <base href="/musik/liedtexte" /><!-- fuer error_404.php -->
      <link rel=stylesheet  href='css/basis.css'>
    </head>
    

    Ich schenk dir einen Slash.

    Bis demnächst
    Matthias

    --
    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
    1. Hallo Matthias,

      Ich schenk dir einen Slash.

      Uups, und wie mit Zauberhand funktioniert's:

      <base href="/musik/liedtexte/" /><!-- fuer error_404.php -->
      

      Da bin ich HTML/Kopfdaten/base aber auf den Leim gegangen. Dort und bei w3schools.com werden als Beispiele Domains angegeben.

      Danke.

      1. Hallo Matthias,

        Ich schenk dir einen Slash.

        Uups, und wie mit Zauberhand funktioniert's:

        <base href="/musik/liedtexte/" /><!-- fuer error_404.php -->
        

        Da bin ich HTML/Kopfdaten/base aber auf den Leim gegangen. Dort und bei w3schools.com werden als Beispiele Domains angegeben.

        Und warum machstes dann nicht? Bei mir funkionierts mit

        <base href="http://%domain%">

        jedenfalls einwandfrei wenn in %domain% was Richtiges drinsteht.

        PS: Hier im Ort gibts einen Orgelbauverein die sind sogar online.

        1. Und warum machstes dann nicht? Bei mir funkionierts mit

          <base href="http://%domain%">

          jedenfalls einwandfrei wenn in %domain% was Richtiges drinsteht.

          Ohne es getestet zu haben: Dann klappt's vielleicht lokal nicht mehr? Normalerweise drucke ich die Liedtexte nicht aus dem Internet.

          Au weh, mit dem "neuen" <base> Eintrag geht's lokal nicht mehr. Ich rufe file:///home/xxx/www/yyy/musik/liedtexte/1_kalles_liederbuch_a4.htm

          Die css/basis.css wird lokal mit <base href="/musik/liedtexte/" />nicht gefunden.

          PS: Hier im Ort gibts einen Orgelbauverein die sind sogar online.

          Wie kommst du auf dieses Thema? Solche Vereine gibt's zu Hauf. Welcher Ort? Ich habe ja nicht vor, eine Kirchenorgel zu bauen.

          Linuchs

          1. Hallo

            Ohne es getestet zu haben: Dann klappt's vielleicht lokal nicht mehr?

            Wenn der Rechner in dem Moment online ist, sollten die im Dokument referenzierten Ressourcen auch geladen werden können. Ist der Rechner aber offline, geht das natürlich nicht.

            Au weh, mit dem "neuen" <base> Eintrag geht's lokal nicht mehr. Ich rufe file:///home/xxx/www/yyy/musik/liedtexte/1_kalles_liederbuch_a4.htm

            Die css/basis.css wird lokal mit <base href="/musik/liedtexte/" />nicht gefunden.

            Das ist logisch. Alle referenzierten Ressourcen werden nun im Verzeichnis „/musik/liedtexte/“ des lokalen Dateisystems gesucht. Das Verzeichnis/den Pfad gibt es aber mit großer Wahrscheinlichkeit nicht.

            Tschö, Auge

            --
            Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
            Toller Dampf voraus von Terry Pratchett
          2. @@Linuchs

            Au weh, mit dem "neuen" <base> Eintrag geht's lokal nicht mehr. Ich rufe file:///home/xxx/www/yyy/musik/liedtexte/1_kalles_liederbuch_a4.htm

            Warum tust du das? Lokal kann ja auch heißen: über den lokalen Webserver http://localhost/….

            LLAP 🖖

            --
            „Wenn du eine weise Antwort verlangst, musst du vernünftig fragen.“ —Johann Wolfgang von Goethe
  2. Hallo und guten Abend,

    wenn ich eine HTML Datei aufrufe, möchte ich ein Verzeichnis angeben für die weiteren Dateien wie CSS, IMG, ... Aber <base> funktioniert nicht.

    habe ich mich gerade heut drüber geärgert. Die Möglichkeiten in Verbindung mit PHP hängen vom OS und der PHP-Version darauf ab. Ich bin noch nicht zu einer genaueren Untersuchung gekommen, aber hier zuhause auf dem Museums-System mit WinXP-Pro (kastriert) und Xampp (Version müsste ich nachliefern) funktioniert hervorragend:

    <base href="<?php echo $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] ;?>">

    Das funktioniert auf meinem Linux-Server leider nicht. Dort ist $_SERVER['REQUEST_SCHEME'] unbekannt. Kann ssein, dass ein Update hilft...

    Grüße
    TS

    --
    es wachse der Freifunk
    http://freifunk-oberharz.de
    1. Hallo TS,

      <base href="<?php echo $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] ;?>">

      Eigentlich möchte man keine vollständigen oder protokollrelativen URIs in base haben.

      Bis demnächst
      Matthias

      --
      Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
      1. Hallo und guten Abend,

        <base href="<?php echo $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] ;?>">

        Eigentlich möchte man keine vollständigen oder protokollrelativen URIs in base haben.

        ... sondern?

        Bitte keine halben Aussagen! Ich will ja sofort etwas dabei lernen und nicht erst wieder auf eine unbestimmte Surfing-Reise zurückgeschickt werden!

        Grüße
        TS

        --
        es wachse der Freifunk
        http://freifunk-oberharz.de
        1. Hallo TS,

          <base href="<?php echo $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] ;?>">

          Eigentlich möchte man keine vollständigen oder protokollrelativen URIs in base haben.

          ... sondern?

          absolute Angaben bezogen auf das Basisverzeichnis.

          Bis demnächst
          Matthias

          --
          Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
          1. Hallo und guten Abend,

            <base href="<?php echo $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] ;?>">

            Eigentlich möchte man keine vollständigen oder protokollrelativen URIs in base haben.

            ... sondern?

            absolute Angaben bezogen auf das Basisverzeichnis.

            Bitte immer harte Beispiele, wenn notwendig mit Gültigkeitsbereich...

            Grüße
            TS

            --
            es wachse der Freifunk
            http://freifunk-oberharz.de
      2. Hi,

        Eigentlich möchte man keine vollständigen oder protokollrelativen URIs in base haben.

        eigentlich möchte man kein base haben.

        cu,
        Andreas a/k/a MudGuard

        1. Hallo und guten Abend,

          eigentlich möchte man kein base haben.

          Da habe ich jetzt ein DejaVu!

          Haben wir das eventuell schon mal mit einem sinnvollen und verständlichen Ergebnis diskutiert? Ich habe im Archiv allerdings leider keine abschließende Weisheit finden können... :-(

          Grüße
          TS

          --
          es wachse der Freifunk
          http://freifunk-oberharz.de
          1. Hi,

            eigentlich möchte man kein base haben.

            Da habe ich jetzt ein DejaVu!

            Haben wir das eventuell schon mal mit einem sinnvollen und verständlichen Ergebnis diskutiert? Ich habe im Archiv allerdings leider keine abschließende Weisheit finden können... :-(

            Das ist ähnlich wie mit dem Spruch bzgl. Regex., sinngemäß: ich habe ein Problem - aber das kann ich mit Regex lösen. Jetzt habe ich 2 Probleme.

            Du hast ein Problem mit Verzeichnissen - aber meinst, das könntest Du mit Regex lösen. Jetzt hast Du 2 Probleme.

            Ich würde eher versuchen, das ursprüngliche Problem zu beseitigen, statt an den Symptomen rumzupfuschen.

            Warum werden die css-Dateien nicht mit server-relativem Pfad eingebunden, also

            <link rel=stylesheet  href='/musik/liedtexte/css/basis.css'>
            

            Dann wäre es vollkommen wurscht, welcher Pfad in der Url benutzt wird, um die Seite anzuzeigen.

            cu,
            Andreas a/k/a MudGuard

  3. Es geht darum, einen <base> Eintrag dann zu generieren, wenn die HTML-Datei nicht aus dem eigenen Verzeichnis aufgerufen wird, also der Teilstring "liedtexte" fehlt.

    Meine Idee:

    <head>
    ...
    <script>
    // fuer error_404.php
    var base = "<base href=\"/musik/liedtexte/\" \/>";
    var loca = window.location;
    if( window.location.indexOf ("liedtexte") === false ) {
      document.writeln( base );
    }
    </script>
      <link rel=stylesheet  href='css/basis.css'>
    </head>
    

    Es wird der Javascript-Fehler ausgegeben: TypeError: window.location.indexOf is not a function

    Merkwürdig, mit base.indexOf geht das, mit loca.indexOf aber auch nicht.

    Linuchs

    1. Es wird der Javascript-Fehler ausgegeben: TypeError: window.location.indexOf is not a function

      typeof window.location --> "object"

      Gib mal "window.location" in die JS-Konsole Deines Browsers ein.

    2. Hallo Linuchs,

      Es wird der Javascript-Fehler ausgegeben: TypeError: window.location.indexOf is not a function

      Merkwürdig, mit base.indexOf geht das, mit loca.indexOf aber auch nicht.

      Was daran liegt, dass window.location kein string ist sondern ein object. Vielleicht solltest du window.location.href verwenden.

      Bis demnächst
      Matthias

      --
      Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
      1. Hallo Matthias,

        Vielleicht solltest du window.location.href verwenden.

        Danke, der Javascript-Fehler ist verschwunden, aber das if wird nicht wahr:

        <head>
        ...
        <script>
        if( window.location.href.indexOf ("liedtexte") === false ) {
          document.writeln( "<base href=\"/musik/liedtexte/\" \/>" );
        }
        </script>
          <link rel=stylesheet  href='css/basis.css'>
        </head>
        

        Dieser Test klappt für die online-Version wie gewünscht, aber eben nicht für die lokale Version:

        <head>
        ...
        <script>
        document.writeln( "<base href=\"/musik/liedtexte/\" \/>" );
        </script>
          <link rel=stylesheet  href='css/basis.css'>
        </head>
        

        Linuchs

        1. Hi,

          Danke, der Javascript-Fehler ist verschwunden, aber das if wird nicht wahr:

          if( window.location.href.indexOf ("liedtexte") === false ) {
          

          liefert indexOf in Javascript wirklich false bei nicht-Auffinden? Ich hätte -1 erwartet ...

          cu,
          Andreas a/k/a MudGuard

          1. Hi,

            liefert indexOf in Javascript wirklich false bei nicht-Auffinden? Ich hätte -1 erwartet ...

            Danke, das war's. Hatte ich mit PHP verwexelt, bei strpos() wird FALSE zurückgegeben.

            Linuchs

        2. Danke, der Javascript-Fehler ist verschwunden, aber das if wird nicht wahr:

          Gib mal "window.location.href.indexOf ("liedtexte")" in die JS-Konsole Deines Browsers ein und drück "Enter/Return"