Helge Rex: Apache: Seite mit anderer Endung anzeigen

Hallo zusammen,

ich möchte erreichen, daß mein Apache (V 1.13, SuSE 7.2) eine XML-Datei ausliefert, wenn die zugehörige HTML-Datei nicht existiert.

Habe folgende Regel aufgestellt (steht in der .htaccess für das betreffende Verzeichnis):

RewriteEngine  on
RewriteBase /
RewriteCond %{REQUEST_FILENAME}   !-s
RewriteRule (.+).html$          $1.xml   [R]

Wenn ich jetzt "testseite.html" aufrufe, erhalte ich "Error 404", Apache liefert mir nicht die Datei "testseite.xml" zurück.
Warum nicht? Was ist an der Regel falsch?
Im Archiv und mit Google bin ich nicht fündig geworden.

Zweite Frage:
Wie erreiche ich, daß ein Parser-Script mit dem Namen der XML-Datei als Parameter aufgerufen wird, wenn die HTML-Datei nicht existiert oder älter als die zugehörige XML-Datei ist?
Auch hier bin ich nicht wirklich fündig geworden.

Gruß und Danke im Voraus
Helge

  1. Moin!

    Hallo zusammen,

    ich möchte erreichen, daß mein Apache (V 1.13, SuSE 7.2) eine XML-Datei ausliefert, wenn die zugehörige HTML-Datei nicht existiert.

    Habe folgende Regel aufgestellt (steht in der .htaccess für das betreffende Verzeichnis):

    RewriteEngine  on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME}   !-s
    RewriteRule (.+).html$          $1.xml   [R]

    Deine RewriteCond greift vermutlich nicht.

    -s testet laut Doku:
    "'-s' (is regular file with size)
    Treats the TestString as a pathname and tests if it exists and is a regular file with size greater than zero."

    !-s greift also, wenn die genannte Datei nicht vorhanden ist. Aber du suchst absolut im falschen Verzeichnis, denn der nackte REQUEST_FILENAME allein ist nicht der gültige Pfadname zur Datei.

    In der Doku steht zwar auch:
    "REQUEST_FILENAME
    The full local filesystem path to the file or script matching the request."

    Das ist aber nach meiner Erfahrung relativ zum DOCUMENT_ROOT zu verstehen, der für die absolute Pfadangabe noch hinzuaddiert werden muß.

    Eigentlich sollte aber immer umgeleitet werden, weil auch die vorhandenen Dateien nicht gefunden werden.

    Mit mehr Error-Reporting und den Error-Logfiles (RewriteLogLevel hochsetzen) könntest du dem Fehler selbst auf die Spur kommen.

    Zweite Frage:
    Wie erreiche ich, daß ein Parser-Script mit dem Namen der XML-Datei als Parameter aufgerufen wird, wenn die HTML-Datei nicht existiert oder älter als die zugehörige XML-Datei ist?
    Auch hier bin ich nicht wirklich fündig geworden.

    Dann solltest du überlegen, ganz grundsätzlich immer das Skript aufzurufen, egal welche Datei vorhanden ist, und die Verfügbarkeit im Skript selbst prüfen. Insbesondere, weil du auch die Dateidaten prüfen willst. Im Erfolgsfall für die HTML-Datei schickst du diese einfach 1:1 an den Browser - soll XML konvertiert werden, schickst du eben das Ergebnis weg.

    Das kann auch ganz ohne RewriteRule auskommen.

    - Sven Rautenberg

    --
    ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
    1. Habe folgende Regel aufgestellt (steht in der .htaccess für das betreffende Verzeichnis):

      RewriteEngine  on
      RewriteBase /
      RewriteCond %{REQUEST_FILENAME}   !-s
      RewriteRule (.+).html$          $1.xml   [R]

      Deine RewriteCond greift vermutlich nicht.

      -s testet laut Doku:
      "'-s' (is regular file with size)
      Treats the TestString as a pathname and tests if it exists and is a regular file with size greater than zero."

      !-s greift also, wenn die genannte Datei nicht vorhanden ist. Aber du suchst absolut im falschen Verzeichnis, denn der nackte REQUEST_FILENAME allein ist nicht der gültige Pfadname zur Datei.

      In der Doku steht zwar auch:
      "REQUEST_FILENAME
      The full local filesystem path to the file or script matching the request."

      Das ist aber nach meiner Erfahrung relativ zum DOCUMENT_ROOT zu verstehen, der für die absolute Pfadangabe noch hinzuaddiert werden muß.

      Eigentlich sollte aber immer umgeleitet werden, weil auch die vorhandenen Dateien nicht gefunden werden.

      Mit mehr Error-Reporting und den Error-Logfiles (RewriteLogLevel hochsetzen) könntest du dem Fehler selbst auf die Spur kommen.

      Ich habe Logging jetzt eingeschaltet:

      RewriteLog "/var/log/httpd/rewrite.log"
      RewriteLogLevel 9

      Das Logfile wird zwar angelegt, es wird aber nichts hineingeschrieben.

      Wie erreiche ich, daß ein Parser-Script mit dem Namen der XML-Datei als Parameter aufgerufen wird, wenn die HTML-Datei nicht existiert oder älter als die zugehörige XML-Datei ist?
      Auch hier bin ich nicht wirklich fündig geworden.

      Dann solltest du überlegen, ganz grundsätzlich immer das Skript aufzurufen, egal welche Datei vorhanden ist, und die Verfügbarkeit im Skript selbst prüfen. Insbesondere, weil du auch die Dateidaten prüfen willst. Im Erfolgsfall für die HTML-Datei schickst du diese einfach 1:1 an den Browser - soll XML konvertiert werden, schickst du eben das Ergebnis weg.

      Das kann auch ganz ohne RewriteRule auskommen.

      Und wie muß das aussehen? Habe dafür kein passendes Beispiel gefunden.

      • Sven Rautenberg

      Danke und Gruß
      Helge

  2. Hi,

    Hallo zusammen,

    ich möchte erreichen, daß mein Apache (V 1.13, SuSE 7.2) eine XML-Datei ausliefert, wenn die zugehörige HTML-Datei nicht existiert.
    RewriteEngine  on

    Aus der Apache Doku:
    RewriteEngine
    Syntax: RewriteEngine on|off
    Default: RewriteEngine off
    Context: server config, virtual host, directory, .htaccess
    Override: FileInfo
    Status: Extension
    Module: mod_rewrite.c
    Compatibility: Apache 1.2

    Der aktuelle Apache ist 1.3.28.

    1.13 ist vermutlich 1.1.3?
    Dann kennt der das noch gar nicht...
    Ähnliches gilt für die anderen Rewrite-Teile...

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
    1. hallo Andreas,

      Der aktuelle Apache ist 1.3.28.

      Man sollte Apache 2.0.x nicht ganz und gar ignorieren.

      1.13 ist vermutlich 1.1.3?

      Nö. Die SuSE LINUX 7.2 hatte einen 1.3.13 als "default". Ich weiß im Moment nicht, ob es einen Apache 1.1.3 überhaupt jemals gegeben hat.
      Aber egal: Beides (Betriebssystem und Webserver) ist auf jeden Fall zu alt und sollte schleunigst auf den aktuellen Stand gebracht werden. Bei der SuSE, wie bei allen LINUX-Distributionen, kommts nicht so sehr auf die Distributionsnummer an, sondern mehr auf die Kernelversion. Aber beim Apache kommts sehr wohl auf die Versionsnummer an. Und es ist _absolut_ kein Problem, dafür ein Update zu fahren, die entsprechenden RPM-Pakete gibts zuhauf auf den SuSE-FTP-Servern.

      Dann kennt der das noch gar nicht...
      Ähnliches gilt für die anderen Rewrite-Teile...

      Das steht zu vermuten.

      Grüße aus Berlin

      Christoph S.

      1. Hi,

        Der aktuelle Apache ist 1.3.28.
        Man sollte Apache 2.0.x nicht ganz und gar ignorieren.

        Ich meinte ja auch den aus der 1er Serie...

        1.13 ist vermutlich 1.1.3?
        Nö. Die SuSE LINUX 7.2 hatte einen 1.3.13 als "default".

        Da ich kein Suse habe, kann ich das nicht wissen und muß von der gegebenen Versionsnummer ausgehen...

        cu,
        Andreas

        --
        Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
        http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
    2. ich möchte erreichen, daß mein Apache (V 1.13, SuSE 7.2) eine XML-Datei ausliefert, wenn die zugehörige HTML-Datei nicht existiert.
      RewriteEngine  on

      Aus der Apache Doku:
      RewriteEngine
      Syntax: RewriteEngine on|off
      Default: RewriteEngine off
      Context: server config, virtual host, directory, .htaccess
      Override: FileInfo
      Status: Extension
      Module: mod_rewrite.c
      Compatibility: Apache 1.2

      Kenne ich, hilft mir aber nicht weiter (habe ich berets angegeben).

      Der aktuelle Apache ist 1.3.28.

      1.13 ist vermutlich 1.1.3?
      Dann kennt der das noch gar nicht...
      Ähnliches gilt für die anderen Rewrite-Teile...

      Habe jetzt mal httpd -v ausgeführt (vorher hatte ich "rpm -qa | grep apache" ausgeführt):
      Server version: Apache /1.3.19 (Unix) (SuSE Linux)
      Server built:   Oct 21 2002 10:31:55

      Werde jetzt direkt mal bei SuSE ein Update saugen.

      cu,
      Andreas

      Danke und Gruß
      Helge