Andreas: Header-Weiterleitung von htaccess Error-doc

Hallo!
ich habe ein ganz komisches Problem. Und zwar will ich bei der eingabe von z.B. www.domain.de/24 (Verzeichnis existiert nicht) aber weiterleiten auf die Seite www.domain.de/seite.php?ID=24
Ich hatte das mir so gedacht, dass ich einfach ein 404er Error-Dokument per htaccess "verlinke", und in diesem dann den URL überprüfe, ob der so wie oben ausieht, und entweder die Fehlermeldung ausgeben, oder den Pfad auseinandernehmen, die Zahl in eine Variable übergeben und über den Header zu besagter Seite weiterleiten. Soweit die Theorie.
Ich komme bis zu dem Punkt, an dem ich die Zahl in die Variable übergeben habe(kann mit echo angezeigt werden), aber wenn ich jetzt

header ("Location: http://domain.de/seite.php?ID=$ID");
exit;

eingebe, passiert nix, bis auf das man auf eine leere Seite geleitet wird. Ich habe es mit seite.php?ID=$ID probiert, und auch mit einer echten Nummer, nichts geht, immer leere Seite - ganz weiß?!
Und der Pfad bleibt oben im Browserfenster auch unverändert, also www.domain.de/24.

Ich verstehe das überhaupt nicht. Weiß jemand was ich falsch mache? Was kann ich dagegen machen?

Viele Grüße
Andreas

  1. Hi,

    Ich komme bis zu dem Punkt, an dem ich die Zahl in die Variable übergeben habe(kann mit echo angezeigt werden), aber wenn ich jetzt
    header ("Location: http://domain.de/seite.php?ID=$ID");
    exit;

    meine erste Vermutung waere, dass du schon irgendetwas ausgegeben hast, bevor du den header schickst, und dass die Fehlermeldung von der header-funktion irgendwie unterdrueckt wird.
    Pruef das doch noch mal nach.
    Wenn es das nicht ist, dann waere wahrscheinlich ein Blick ins Error-Log vom Apache hilfreich.

    HTH,
    Gero

    1. Hi!
      Nein, es wurde nichts vorher ausgegeben. Kann es evtl sein das der Apache, PHP oder IE da andere Probleme hat? Denn auf einmal bekomme ich immer nur noch ein 404 Error-doc des IE. Hab mal gehört, das das Error-Dokument eine bestimmte Größe haben müßte(die html Ausgabe? Wie groß?), kann es damit etwas zu tun haben? Denn wenn ich an dieser Stelle ein "normales" error-Dokument(acuh php) ausgebe, bekomme ich die Seite angezeigt?!
      Verstehe das nicht ganz!
      Hat auch was mit nem PHP-Bug zu tun, aber das konnte man umgehen indem man den kpl. Pfad in der htaccess angibt.
      Hast Du noch ne Idee?
      Grüße
      Andreas

  2. Hallo Andreas,

    ich habe ein ganz komisches Problem. Und zwar will ich bei der eingabe von z.B. www.domain.de/24 (Verzeichnis existiert nicht) aber weiterleiten auf die Seite www.domain.de/seite.php?ID=24

    Ich hatte das mir so gedacht, dass ich einfach ein 404er Error-Dokument per htaccess "verlinke", und in diesem dann den URL überprüfe, ob der so wie oben ausieht, und entweder die Fehlermeldung ausgeben, oder den Pfad auseinandernehmen, die Zahl in eine Variable übergeben und über den Header zu besagter Seite weiterleiten. Soweit die Theorie.

    besser als das 404 ErrorDocument ist für dein Problem ein Redirect bzw. das Rewrite Modul geeignet.

    Siehe http://httpd.apache.org/docs/ bzw. http://httpd.apache.org/docs-2.0/

    CYa
    GONZO

    1. Hi!
      Das denke ich mir das es da bessere und saubere Lösungen gibt, nur denke ich läßt mich der Provider wohl kaum an den Apache :-)
      Grüße
      Andreas

      1. Hoi,

        Das denke ich mir das es da bessere und saubere Lösungen gibt, nur
        denke ich läßt mich der Provider wohl kaum an den Apache :-)

        Dafuer gibt es ja die .htacces.

        Gruesse,
         c.j.k

      2. Hallo!
        war wohl etwas zu schnell gedacht! Kann die Module tatsächlich verwenden. Nur kenne ich mich damit so überhaupt gar nicht aus!
        In php funktioniert das ja theoretisch, aber wie mache  ich das dann mit dem Modul? Also erstmal in eine htaccess-Datei das ganze, oder?

        Und dann will ich ja, das wenn jemand ein Verzeichnis im Browser eingibt - dann soll er halt auf eine andere Seite weitergeleitet werden, mit dem Verzeichnisnamen als Variable übergeben(seite?ID=$ID).
        In PHP hatte ich mir das ganze so gedacht:

        $url=parse_url(getenv ("SCRIPT_URI"));
        if (!strstr($url['path'],'.php') && !strstr($url['path'],'.htm') && !strstr($url['path'],'.html')){
        $ID = substr (strrchr ($url[path], "/"), 1);
        echo $ID;
        header ("Location: site.php?ID=$ID");
        exit;
        }

        Geht sowas überhaupt mit dem Modul??? Das einzige was ich da bis jetzt gefunden habe, ist eine einfache Weiterleitung!

        Grüße
        Andreas

        1. Hoi,

          war wohl etwas zu schnell gedacht! Kann die Module tatsächlich
          verwenden. Nur kenne ich mich damit so überhaupt gar nicht aus!

          http://httpd.apache.org/docs/

          In php funktioniert das ja theoretisch, aber wie mache  ich das
          dann mit dem Modul? Also erstmal in eine htaccess-Datei das
          ganze, oder?

          Ja.

          Und dann will ich ja, das wenn jemand ein Verzeichnis im Browser
          eingibt - dann soll er halt auf eine andere Seite weitergeleitet
          werden, mit dem Verzeichnisnamen als Variable
          übergeben(seite?ID=$ID).

          RewriteEngine On
          RewriteCond %{REQUEST_URI} /[0-9]+
          RewriteRule /([0-9]+) /site.php?ID=$1 [L,R=301]

          Geht sowas überhaupt mit dem Modul???

          Na klar.

          Das einzige was ich da bis jetzt gefunden habe, ist eine einfache
          Weiterleitung!

          Die macht man am besten ueber Redirect, RedirectPermanent, etc.

          Gruesse,
           c.j.k

          1. Hi!

            RewriteEngine On
            RewriteCond %{REQUEST_URI} /[0-9]+
            RewriteRule /([0-9]+) /site.php?ID=$1 [L,R=301]

            Hatte mich ein wenig durch die Doku gewühlt, so grob verstehe ich das jetzt. Heißt also, Du ersetzt ZAHLEN egal wie lang durch den Dateinamen. Aber was ist jetzt ID=$1??? Der String den man ersetzt? Bekommne ich denn dann nicht genau wie in php das Problem, dass davor ein "/" steht?
            Was heißt [L,R=301]? Sowas finde ich gar nicht in der Doku!

            Viele Grüße

            Andreas

            1. Hoi,

              RewriteEngine On
              RewriteCond %{REQUEST_URI} /[0-9]+
              RewriteRule /([0-9]+) /site.php?ID=$1 [L,R=301]

              Hatte mich ein wenig durch die Doku gewühlt, so grob verstehe ich
              das jetzt. Heißt also, Du ersetzt ZAHLEN egal wie lang durch den
              Dateinamen.

              Richtig.

              Aber was ist jetzt ID=$1???

              Das ID= ist ein ganz normaler String. Das $1 ist wichtig: darin steht
              die Zahl, weil ich das '[0-9]+' in Klammern stehen hatte.

              Der String den man ersetzt? Bekommne ich denn dann nicht genau
              wie in php das Problem, dass davor ein "/" steht?

              Was meinst du?

              Was heißt [L,R=301]? Sowas finde ich gar nicht in der Doku!

              Oh doch, das findest du da ;-) Das 'L' heisst 'Last Rule', das 'R'
              heisst 'Redirect' (man kann naemlich auch eine Kette von Redirect
              Rules machen) und das '=301' heisst, mit dem Status-Code 301. 301
              steht fuer 'moved permanently'.

              Gruesse,
               c.j.k

              1. Hi!

                Das ID= ist ein ganz normaler String. Das $1 ist wichtig: darin steht
                die Zahl, weil ich das '[0-9]+' in Klammern stehen hatte.

                und wieso ausgerechnet $1? Was ist das überhaupt für eine Sprache - PERL???

                Der String den man ersetzt? Bekommne ich denn dann nicht genau
                wie in php das Problem, dass davor ein "/" steht?

                Was meinst du?

                in PHP bekomme ich so den Pfad:

                $url=parse_url(getenv("SCRIPT_URI"));
                $pfad=$url[path];

                Aber wenn ich jetzt ein Verzeichnis 123 eingegeben hätte, bekäme ich /123 zurück und nicht nur die Zahl!
                Also mache ich das so:

                $pfad=substr(strrchr($url[path], "/"),1);

                Aber das scheint ja in diesem Fall kein Problem zu sein! Aber wenn das so "einfach" ist, lohnt es sich ja anscheinend wirklich mal sich damit richtig auseinander zu setzen! Wenn das so klappt, nicht schlecht, Error-Variante war doch ganz schöner Mist :-)

                Oh doch, das findest du da ;-)

                Danke für die Erklärung, aber wirklich, wenn ich in http://httpd.apache.org/docs/mod/mod_rewrite.html nach "[R" oder "[L" suche finde ich zwar alles mögliche, aber kleine EWrklärung, was es bedeutet! Andere Parameter werden wohl erklärt!

                Aber vielen Dank!

                Grüße
                Andreas

                PS: Schon wieder ein ganz neues Thema, das gibts ja gar nicht....

                1. Hoi,

                  Das ID= ist ein ganz normaler String. Das $1 ist wichtig:
                  darin steht die Zahl, weil ich das '[0-9]+' in Klammern stehen
                  hatte.
                  und wieso ausgerechnet $1?

                  Weil es die erste Klammer ist. Die zweite Klammer stuende in $2,
                  die Dritte in $3, etc.

                  Was ist das überhaupt für eine Sprache - PERL???

                  Nein, Regular Expressions.

                  [... /123 statt 123 ...]
                  Aber das scheint ja in diesem Fall kein Problem zu sein!

                  In der Tat, nein. Ich speichere ja nur die Ziffern in den Klammern.

                  Aber wenn das so "einfach" ist, lohnt es sich ja anscheinend
                  wirklich mal sich damit richtig auseinander zu setzen!

                  Natuerlich.

                  Wenn das so klappt,

                  Das wird genau dann klappen, wenn mod_rewrite installiert ist.

                  nicht schlecht, Error-Variante war doch ganz schöner Mist :-)

                  Vor allem produziert sie 404-Eintraege in der Error-Log.

                  Oh doch, das findest du da ;-)
                  Danke für die Erklärung, aber wirklich, wenn ich in
                  http://httpd.apache.org/docs/mod/mod_rewrite.html nach
                  "[R" oder "[L" suche finde ich zwar alles mögliche, aber kleine
                  EWrklärung, was es bedeutet! Andere Parameter werden wohl erklärt!

                  Aus http://httpd.apache.org/docs/mod/mod_rewrite.html:

                  *   'redirect|R  [=code]' (force redirect)
                        Prefix Substitution with http://thishost[:thisport]/ (which
                        makes the new URL a URI) to force a external redirection. If
                        no code is given a HTTP response of 302 (MOVED TEMPORARILY) is
                        used. If you want to use other response codes in the range
                        300-400 just specify them as a number or use one of the
                        following symbolic names: temp (default), permanent, seeother.
                        Use it for rules which should canonicalize the URL and give it
                        back to the client, e.g., translate /~'' into /u/'' or
                        always append a slash to /u/user, etc.

                  Note: When you use this flag, make sure that the substitution
                        field is a valid URL! If not, you are redirecting to an
                        invalid location! And remember that this flag itself only
                        prefixes the URL with http://thishost[:thisport]/, rewriting
                        continues. Usually you also want to stop and do the redirection
                        immediately. To stop the rewriting you also have to provide the
                        'L' flag.

                  Gruesse,
                   c.j.k

                2. Hallo nochmal!
                  Hörte sich ja wirklich gut an, aber irgendwie funktioniert das leider nicht(404). Ich weiß definitiv das mod_rewrite nutzbar ist, außerdem zeigt die Domain auf einen virtuellen Host.

                  Ich habe nochmal folgende Zeile eingefügt:
                  RewriteBase /kunden/173336/webseite/
                  das ist der Servverpfad in dem sowohl die htaccess als auch die site.php liegen, außerdem das Rootverzeichnis der Domain.
                  also:

                  RewriteEngine On
                  RewriteBase /kunden/173336/webseite/
                  RewriteCond %{REQUEST_URI} /[0-9]+
                  RewriteRule /([0-9]+) /site.php?ID=$1 [L,R=301]

                  Hat aber auch nichts gebracht, bekomme immer einfach nen 404er Error.
                  Ich habe obigen Code so wie er ist in eine Datei .htaccess geschrieben und in das Hauptverzeichnis gelegt. Mit Error Documets ging das noch.

                  Also wenn ich aufrufe www.domain.de/345 bekomme ich besagt Fehler, anstatt umgeleitet zu werden. Kannst Du das verstehen?

                  Grüße
                  Andreas

                  1. Hoi,

                    RewriteEngine On
                    RewriteBase /kunden/173336/webseite/

                    Nee, weglassen.

                    RewriteCond %{REQUEST_URI} /[0-9]+

                    Das aendere vielleicht mal in

                    RewriteCond %{REQUEST_URI} ^/[0-9]+

                    RewriteRule /([0-9]+) /site.php?ID=$1 [L,R=301]

                    Und das in

                    RewriteRule ^/([0-9]+) /site.php?ID=$1 [R=301,L]

                    Ich habe obigen Code so wie er ist in eine Datei .htaccess
                    geschrieben und in das Hauptverzeichnis gelegt. Mit Error
                    Documets ging das noch.

                    Wo kann man sich das mal anschauen?

                    Gruesse,
                     c.j.k

                    1. Hi!
                      Ich hatte auch mal eine Anfrage an die Technik meines Providers geschickt, ich dachte vielleicht ist das ja ein spezifisches Problem, und da kam promt die Antwort:

                      RewriteEngine On
                      RewriteRule ^([0-9]+)$ /site.php?ID=$1 [L,R=301]

                      Das klappt prima! Braucht man also die Bedingung nicht? Wenn ich was anderes als eine Zahl hinter dem Slash eingebe kommt eh ein 404er Fehler! Wozu dann die Bedingung noch?

                      Aber das dumme, jetzt ist direkt ein neues Problem aufgetaucht: Klappt prima von der Domain 1 aus: http://www.meinhausonline.de

                      Aber von der Domain 2: http://www.meinewohnungonline.de klappt das gar nicht - 404er Fehler. Beider Domains sind genau gleich auf dasselbe Verzeichnis gerichtet - das ist doch unmöglich, oder?

                      Zum testen:
                      http://www.meinhausonline.de/24
                      http://www.meinewohnungonline.de/24
                      Wie gesagt, da besteht kein Unterschied, woran könnte das jetzt liegen? direkt funktioniert der Aufruf nämlich:

                      http://www.meinhausonline.de/site.php?ID=24
                      http://www.meinewohnungonline.de/site.php?ID=24

                      Ne Idee?

                      Viele Grüße
                      Andreas

                      1. Hi Andreas,

                        Aber von der Domain 2:
                        http://www.meinewohnungonline.de klappt
                        das gar nicht - 404er Fehler.

                        Du solltest dringend einen Blick in Dein error_log werfen. Dafür ist es nämlich da - gerade in Deinem Fall.

                        Viele Grüße
                              Michael

                        1. Hi!
                          Ja, nur ist das nicht immer so einfach, wenn es ein gehosteter Server ist! Aber die Technik kann das und hat mir geholfen. Jetzt klappt _fast_ alles hervorragend, bis auf die Tatsache, dass wenn ich ein Error Dokument einfüge aus irgendeinem Grund jetzt z.B. bei einer nicht vorhandenen Seite richtig auf das entsprechende Dokument weitergeleitet wird, anstatt unter der nicht vorhandenen Adresse das Error-Dokument auszugeben, ist sehr blöd da ich so die "fehlende" Datei nicht ermitteln kann, aber ich habe deswegen weiter oben einen Thread eröffnet!
                          Grüße
                          Andreas

        2. Hallo Andreas,

          Geht sowas überhaupt mit dem Modul??? Das einzige was ich da bis jetzt gefunden habe, ist eine einfache Weiterleitung!

          Wenn du http://httpd.apache.org/docs/ durchgelesen hast wirst du wissen,
          daß viel mehr als eine einfache Weiterleitung möglich ist.

          CYa
          GONZO