sascha: problem bei rewrite rule in htaccess

hallo,
ich hab ein kleines problem beim htaccess!

folgendes steht in der htaccess
----------------------------------
RewriteEngine on
Options FollowSymLinks
RewriteRule ^http://www.domain1.de/meldung_(.*).html$ http://www.domain2.de/cgi-bin/baseportal.pl?htx=/meldung&Id==$1 [NC] [L]
----------------------------------
www.domain1.de/meldung_5.html eingebe soll daraus folgender link werden:
http://www.domain2.de/cgi-bin/baseportal.pl?htx=/meldung&Id==5

ich bekomme aber immer ne 404-fehlerseite.

hat hier denn jemand einen tipp für mich?
danke
sascha

  1. Hellihello

    hat hier denn jemand einen tipp für mich?

    probiers doch erstmal ohne parameter. Zudem steht da ein "==" in den Get-Paramtern, weiß nicht, ob das stört.

    Ist dein pl-script denn sonst aufrufbar (richtige Rechte?)

    Dank und Gruß,

    frankx

    1. hallo frankx,
      das script ist ganz normal aufrufbar.

      redirects klappen auch ganz normal, z.b.
      Redirect /index.html /cgi-bin/baseportal.pl?htx=/home

      an dem == lags auch nicht

      wenn ich aus dem www.domain1.de/meldung_5.html
      ein
      www.domain2.de/cgi-bin/baseportal.pl?htx=//meldung&Id=5
      mache, klappt der aufruf auch korrekt.

      :-(
      sascha

      Hellihello

      hat hier denn jemand einen tipp für mich?

      probiers doch erstmal ohne parameter. Zudem steht da ein "==" in den Get-Paramtern, weiß nicht, ob das stört.

      Ist dein pl-script denn sonst aufrufbar (richtige Rechte?)

      Dank und Gruß,

      frankx

  2. www.domain1.de/meldung_5.html eingebe soll daraus folgender link werden:
    http://www.domain2.de/cgi-bin/baseportal.pl?htx=/meldung&Id==5

    Dein Parameter namens Id hat den Wert '=5', hast du das im Script bedacht?

    ich bekomme aber immer ne 404-fehlerseite.

    Klingt so, als ob die Umleitung funktioniert. Was ergibt im Perlscript die Abfrage nach Id? Was steht im Errorlog?

    Siechfred

    1. wenn ich das script bzw. die seite http://www.domain2.de/cgi-bin/baseportal.pl?htx=/meldung&Id==5
      direkt aufrufe komme ich ans ziel.

      nur der direkte aufruf http://www.domain1.de/meldung_5.html
      wird nicht umgeleitet.

      im log steht:
      [11/Sep/2007:15:43:58 +0200] "GET /meldung_5.html HTTP/1.1" 404 505 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3"

      gruß
      sascha

      www.domain1.de/meldung_5.html eingebe soll daraus folgender link werden:
      http://www.domain2.de/cgi-bin/baseportal.pl?htx=/meldung&Id==5

      Dein Parameter namens Id hat den Wert '=5', hast du das im Script bedacht?

      ich bekomme aber immer ne 404-fehlerseite.

      Klingt so, als ob die Umleitung funktioniert. Was ergibt im Perlscript die Abfrage nach Id? Was steht im Errorlog?

      Siechfred

      1. im log steht:
        [11/Sep/2007:15:43:58 +0200] "GET /meldung_5.html HTTP/1.1" 404 505 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3"

        Aha, dann habe ich falsch gelegen und deine RewriteRule greift nicht. Was ich übersehen habe ist der Standardwert für RewriteBase, und das ist der physische Verzeichnispfad. Dieser ist relativ zu dem Verzeichnis, in dem sich die .htaccess befindet. Daher matcht deine Regel:

        RewriteRule ^http://www.example.de/meldung_(.*).html$ http://www.example2.de/cgi-bin/baseportal.pl?htx=/meldung&Id==$1 [NC] [L]

        auf folgenden Pfad:

        http://www.example.de/http://www.example.de/meldung_5.html

        sofern die htaccess im Dokumentenverzeichnis liegt. Das ist natürlich nicht das gewünschte Ergebnis. Deine korrigierte Regel müsste so aussehen:

        RewriteRule ^meldung_[0-9]+.html$ http://www.example2.de/cgi-bin/baseportal.pl?htx=/meldung&Id==$1 [R,L]

        Da du nur Zahlen durchlassen willst, solltest du den RegExp entsprechend einschränken, der Quantifier '*' heißt kein oder mehrmals, besser wäre m.E. '+'. Den Punkt im Dateinamen musst du maskieren, da er in einem RegExp eine besondere Bedeutung hat (Zeichenklasse "alle Zeichen"). Das NC-Flag brauchst du nicht, da Zahlen nicht case-sensitive sind, und du solltest ggf. einen Redirect ausführen (R-Flag).

        Siechfred

        1. hallo siechfred,
          many many many thanx - jetzt hab ich`s!!

          DANKE
          sascha
          ----------------------------------------------
          RewriteRule ^meldung_([1-9][0-9]*).html$ http://www.domain2.de/cgi-bin/baseportal.pl?htx=/meldung&Id==$1 [R,L]
          ----------------------------------------------

          im log steht:
          [11/Sep/2007:15:43:58 +0200] "GET /meldung_5.html HTTP/1.1" 404 505 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3"

          Aha, dann habe ich falsch gelegen und deine RewriteRule greift nicht. Was ich übersehen habe ist der Standardwert für RewriteBase, und das ist der physische Verzeichnispfad. Dieser ist relativ zu dem Verzeichnis, in dem sich die .htaccess befindet. Daher matcht deine Regel:

          RewriteRule ^http://www.example.de/meldung_(.*).html$ http://www.example2.de/cgi-bin/baseportal.pl?htx=/meldung&Id==$1 [NC] [L]

          auf folgenden Pfad:

          http://www.example.de/http://www.example.de/meldung_5.html

          sofern die htaccess im Dokumentenverzeichnis liegt. Das ist natürlich nicht das gewünschte Ergebnis. Deine korrigierte Regel müsste so aussehen:

          RewriteRule ^meldung_[0-9]+.html$ http://www.example2.de/cgi-bin/baseportal.pl?htx=/meldung&Id==$1 [R,L]

          Da du nur Zahlen durchlassen willst, solltest du den RegExp entsprechend einschränken, der Quantifier '*' heißt kein oder mehrmals, besser wäre m.E. '+'. Den Punkt im Dateinamen musst du maskieren, da er in einem RegExp eine besondere Bedeutung hat (Zeichenklasse "alle Zeichen"). Das NC-Flag brauchst du nicht, da Zahlen nicht case-sensitive sind, und du solltest ggf. einen Redirect ausführen (R-Flag).

          Siechfred

        2. hallo,

          was ich übersehen hatte, ist eine blätterfunktion.
          hier muß man 2 werte übergeben. hab schon einiges gelesen, komme hier aber auch nicht so richtig weiter..

          hier mein perl mit der blätterfunktion.
          der weiterlink ist so wie es momentan ist.

          <perl>
          $range=$_get{range}||"0,6";
          $Rubrik||="$Rubrik";

          get "Rubrik==Fotos online==1 range=$range", "fotos";
          #------------------------------------------------
          out "<table cellpadding='0' cellspacing='0' border='0' width='420' valign='top' style='margin-left:5px; margin-right:5px;'>";

          while(get_next(fotos))
          {
          $counter++;
          <left>;
          if($counter%3==0){$trenner = "<tr>";
          }
          else{$trenner = "";
          }
          $rubrik_html = convert_html($Rubrik);
          out "<td valign=top width='210'><div class=text style='margin-left:5px; margin-top:3px; margin-right:15px; margin-bottom:3px;'>
          <a href='....'><img src='/bp-files/$Foto' width='120' style='border:solid 1px #666666'></a>
          </td><td></td>$trenner";
          }

          my $newrange=$_range+$_range_length;
          my $oldrange=$_range-$_range_length;
          $oldrange=0 if $oldrange<0 && $oldrange>-$_range_length;
          out "<a href=\http://www.domain2.de/zuruck.html><b>| zur&uuml;ck bl&auml;ttern |</b> </a>" if $oldrange>=0;
          out "<a href="/cgi-bin/baseportal.pl?htx=//fotos&Rubrik==$Rubrik&range=$newrange,$_range_length">weiter bl&auml;ttern |</b></a>" if $newrange<$_amount_query;

          </perl>
          ---------------------------------------------------------
          das habe ich dafür in der htaccess:

          RewriteRule ^zuruck_(.*)_/?(.*).html$ http://www.domain1.de/cgi-bin/baseportal.pl?htx=/fotos&Rubrik==$Rubrik&range=$1,$2 [NC] [L]

          ich weiß, ich geh vermutlich echt auf die nerven - sorry.

          sascha

          1. was ich übersehen hatte, ist eine blätterfunktion.

            Jaja, der Eifer des Gefechts ;)

            hier muß man 2 werte übergeben. hab schon einiges gelesen, komme hier aber auch nicht so richtig weiter..

            Frage: Wie sollen die URLs aussehen, die du umschreiben willst?

            hier mein perl mit der blätterfunktion.

            Du solltest dich dringend mit dem CGI-Modul beschäftigen zwecks Parsen der URL-Parameter und der Ausgabe von HTML. Aber das nur am Rande.

            das habe ich dafür in der htaccess:
            RewriteRule ^zuruck_(.*)_/?(.*).html$ http://www.domain1.de/cgi-bin/baseportal.pl?htx=/fotos&Rubrik==$Rubrik&range=$1,$2 [NC] [L]

            Also wäre ein Blätterlink z.B sowas: "/zuruck_1foobar.html"? Oder wie stellst du dir das vor? Was steht im Errorlog?

            Siechfred

            1. hi,
              momentan sehen die blätterlinks so aus:
              http://www.doamin1.de/cgi-bin/baseportal.pl?htx=/domain1.de/galerie&Rubrik=$Rubrik&range=0,8
              http://www.doamin1.de/cgi-bin/baseportal.pl?htx=/domain1.de/galerie&Rubrik=$Rubrik&range=8,8
              http://www.doamin1.de/cgi-bin/baseportal.pl?htx=/domain1.de/galerie&Rubrik=$Rubrik&range=16,8

              die erste zahl zegt, ab welcher pos. bilder angezeigt werden, die 2. wieviele bilder bis zum nächsten blättern.

              www.domain2.de/galerie_0,8.html oder
              www.domain2.de/galerie_0_8.html
              auf jedenfall mit domain2.de und kürzer.

              gruß
              sascha

              mit diesem perl-block mache ich im grunde die blätterfunktion:

              <perl>
              $range=$_get{range}||"0,8";
              $Rubrik||="Bildergalerie";
              #---------------------------
              #-------------------
              out "<table width=100% bgcolor=#F3EFD0><tr><td class=menu2>";
              out "<table cellpadding=20>";#  ab hier thumbansicht -->

              get "Rubrik==!$Rubrik range=$range", "galerie";
              #------------------------------------------------
              out "<tr>";
              while(get_next(galerie))
              {
              $counter++;
              if($counter%4==0){$trenner = "</tr><tr>";
              }
              else{$trenner = "";
              }
              $rubrik_html = convert_html($Rubrik);
              out "<td valign=bottom class='green'><a href='http://www.domain1.de/cgi-bin/baseportal.pl?htx=/domain1.de/galeriedetail&Rubrik==$rubrik_html&Id==$_id' target='_blank' class='b'><img src='http://www.domain1.de/files/$Foto' width='110' style='border:solid 2px DD9D24'></a><br>$Titel</td>$trenner";
              }
              out "</tr></table>";
              out "</td></tr></table><center>";
              #------------------------------------
              my $newrange=$_range+$_range_length;
              my $oldrange=$_range-$_range_length;
              $oldrange=0 if $oldrange<0 && $oldrange>-$_range_length;
              out " <a href="$_link&Rubrik=$_get{Rubrik}&range=$oldrange,$_range_length"class='green'>zurück</a> " if $oldrange>=0;
              out " <a href="$_link&Rubrik=$_get{Rubrik}&range=$newrange,$_range_length"class='green'>weiter</a>" if $newrange<$_amount_query;
              #---------------------------------
              </perl>

              1. die erste zahl zegt, ab welcher pos. bilder angezeigt werden, die 2. wieviele bilder bis zum nächsten blättern.

                Okay.

                www.domain2.de/galerie_0,8.html oder
                www.domain2.de/galerie_0_8.html

                Dann müsste sowas eigentlich funktionieren:
                RewriteRule ^galerie_([0-9]+),_.html http://www .....

                $1 wäre dann die Position und $2 die Anzahl. Übrigens, warum hängst du an die Links ".html" an?

                $range=$_get{range}||"0,8";
                $Rubrik||="Bildergalerie";

                Wenn du nur eine Rubrik hast, warum übergibst du dann einen Wert? Der wäre doch m.E. überflüssig.

                Siechfred

                1. hi,
                  ja die rubrik ist überflüssig, stimmt!
                  und .html ist auch überflüssig :-)

                  das ist ja echt einfacher, als gedacht.
                  danke für die tolle unterstützung.

                  gruß
                  sascha

  3. Hast Du mal ins error_log geschaut? Das könnte Dir Aufschluß darüber geben, welche non-existente Seite wirklich angefordert wurde...
    Sonst versuche statt dem (.*) mal (0-9)...

    Gruß,
    Manu