Phil: Mod_Rewrite QUERY_STRING

Hallo,

auf dem Server liegen eine .htaccess und eine index.php

Inhalt .htacess:
RewriteRule ^([a-zA-Z0-9/-]*).html$ /index.php?$1 [QSA]

Inhalt index.php:
<?php echo $_SERVER['QUERY_STRING']; ?>

Rufe ich die seite  ohne "index.html" auf,
also "www.example.org/"
wird mir kein QUERY_STRING ausgegeben.

bei "www.example.org/index.html"
ist der QUERY_STRING logischerweise "index"

Soweit auch klar.

Liegt in dem Verzeichniss noch eine index.html,
wird bei "www.example.org/" jedoch in der index.php (auf
die umgeleitet wurde) als QUERY_STRING "index" angegeben.

Warum?

  1. auf dem Server liegen eine .htaccess und eine index.php
    Inhalt .htacess:
    RewriteRule ^([a-zA-Z0-9/-]*).html$ /index.php?$1 [QSA]

    Rufe ich die seite  ohne "index.html" auf,
    also "www.example.org/"
    wird mir kein QUERY_STRING ausgegeben.

    Ja weil dein pattern nicht matcht.
    bei / wird die index.php direkt aufgerufen, wenn keine index.html exstiert.

    bei "www.example.org/index.html"
    ist der QUERY_STRING logischerweise "index"
    Soweit auch klar.
    Liegt in dem Verzeichniss noch eine index.html,
    wird bei "www.example.org/" jedoch in der index.php (auf
    die umgeleitet wurde) als QUERY_STRING "index" angegeben.
    Warum?

    weil index.html Vorrang vor index.php hat, also
    im Unterschied zu oben
    / auf index.html umgeleitet wird statt auf index.php
    der Folgerequest wird dann von deinem Pattern erfasst.

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
  2. hi,

    Liegt in dem Verzeichniss noch eine index.html,
    wird bei "www.example.org/" jedoch in der index.php (auf
    die umgeleitet wurde) als QUERY_STRING "index" angegeben.

    Warum?

    Weil das im Webserver so als Default konfiguriert wurde: '/' => 'index.html'

    Du kannst das in Deiner .htaccess anpassen, z.B. so:

    DirectoryIndex /index.php?index.html

    Und die Rule kannst Du auch einfacher schreiben, z.B. so:
    RewriteRule ^(.*).html$ /index.php?$1.html

    Genauso hab ich das bei mir gemacht,
    Hotte

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. Du kannst das in Deiner .htaccess anpassen, z.B. so:

      DirectoryIndex /index.php?index.html

      Ist der DirectoryIndex von außen ermittelbar?
      zb. /blablabla123.php?index.html

      was ist mit DC wenn die Seite unter www.example.de/ und www.example.de/index.html erreichbar ist?

      Phil

      1. Du kannst das in Deiner .htaccess anpassen, z.B. so:

        DirectoryIndex /index.php?index.html

        Ist der DirectoryIndex von außen ermittelbar?
        zb. /blablabla123.php?index.html

        Normalerweise ist es ein Serverinterner Subrequest.

        Das kannst du natürllich explizit ändern durch redirect permanent.

        was ist mit DC wenn die Seite unter www.example.de/ und www.example.de/index.html erreichbar ist?

        Ist DC ein Problem?
        Es liegt doch an dir selbst, welche kanonische Form der Domain du propagierst.

        mfg Beat

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische
      2. hi,

        Ist der DirectoryIndex von außen ermittelbar?
        zb. /blablabla123.php?index.html

        was ist mit DC wenn die Seite unter www.example.de/ und www.example.de/index.html erreichbar ist?

        Ach ich geb Dir einfach mal nen wwwLink und noch einen ohne WWW ;-)

        Hier meine Konfig:

        ErrorDocument 404 /cgi-bin/404.cgi

        DirectoryIndex /cgi-bin/view.cgi?/index.html
        RewriteEngine on
        RewriteRule ^(.*).html$ /cgi-bin/view.cgi?/$1.html

        Die biegt alles *.html um zum Script 'view.cgi', was die Datei selbst aus einer DB fischt und zum Browser schickt. Falls x.html nicht in der DB gefunden wird, leitet view.cgi auf 404.cgi um, das kannst Du ja auch mal einfach so aufrufen (/cgi-bin/404.cgi).

        Und da ich auch mit CGI-Umgebungsvariablen arbeite, um die aktuelle Seite aus dem Link-Menu auszublenden, gibts nochn Trick in meinem CGI-Modul:

        Für das Hauptmenu wichtig: '/' => '/index.html'

        $ENV{REQUEST_URI} = '/index.html' if $ENV{REQUEST_URI} eq '/';

        Alles zusammen ist ein Single-User CMS, (nur für mich) für den Fall, dass Mod_Rewrite nicht verfügbar sein sollte, kann ich die Seiten auch als Dateien im Filesystem bereitstellen, ohne dass das für den Besucher anders aussehen würde und ohne dass sich URLs damit ändern.

        Hotte

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  3. Ich danke Euch!

    Ist auch eigentlich logisch. Ich sah vor lauter Wald die
    Bäume wohl nicht.

    Gruß

    Phil