celly123: .htacces Mod-Rewrite Problem

Hallo!

Ich möchte mit mod_rewrite die die angeforderte URL verändern (also nicht in der URL-Leiste, sondern nur die angeforderte). Und zwar möchte ich von www.example.org/index.html nach www.example.org/index.php?p=index und von
www.example.org/infos.html nach www.example.org/index.php?p=infos.
Dies klappt mit folgendem Code sehr gut:

RewriteEngine On  
RewriteRule ^([^/]*).html$ /?p=$1 [QSA]  
RewriteCond %{HTTP_HOST} ^$ [NC]  
RewriteRule ^(.*)$ $1 [R=301,L]

Jetzt möchte ich aber auch von
www.example.org/unterordner/index.html nach www.example.org/index.php?p=index.
Das macht er aber nicht (wegen dem zweiten Unterordner). Der Link wird nicht gefunden.
Kann mir jemand helfen?

Danke,
Marcel

  1. Hi,

    Und zwar möchte ich von www.example.org/index.html nach www.example.org/index.php?p=index

    Jetzt möchte ich aber auch von
    www.example.org/unterordner/index.html nach www.example.org/index.php?p=index.

    Warum? Dann würde ja beide Ressourcen, obwohl unterschiedlich benannt, höchstvermutlich(?) den gleichen Inhalt liefern - das wäre aber unsinnig.

    Das macht er aber nicht (wegen dem zweiten Unterordner). Der Link wird nicht gefunden.
    Kann mir jemand helfen?

    Davon abzuraten ist schon die beste Hilfe, die du kriegen kannst - s.o., weil extrem unsinnig.

    Ansonsten informiere dich, wie man dafür sorgt, dass RewriteRules in Unterverzeichnisse „vererbt“ werden; oder lege ins Unterverzeichnis noch mal eine .htaccess mit entsprechenden Regeln.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. hi,

    Kann mir jemand helfen?

    Es genügt eine Regel:

    PicoBello

    RewriteRule ^.*.htm   /cgi-bin/bello.cgi

    unter der Annahme, dass in der Anforderung steht "schreibe jeden REQUEST_URI um, der auf '.htm' endet.

    Das setzt natürlich weiterhin voraus, dass es serverseitig eine Tabelle gibt, die zu jedem REQUEST_URI den entsprechenden Inhalt bereithält. Wozu das Parametergefrickel, mein System "Pico" ist zwar noch nicht fertig, aber anschauen und ein bischen testen kannst Du schonmal

    http://rolfrost.de/index.htm

    Pico steht mit o.g. RewriteRule

    Viele Grüße, Horst

    Für die Perler

      
    #!/usr/bin/perl  
      
    ###########################################################################  
    # VARs  
      
    # URL des Managers  
    my $manager = '/cgi-bin/pico.cgi';  
    ###########################################################################  
    use strict;  
    use PicoBello;  
      
    my $u = PicoBello->new();  
      
    print $u->header, $u->start_html, menu(), $u->{body},  
        qq(<hr><p><a href="$manager" title="Edit Content">Powered by Pico</a></p>),  
      
      
    $u->end_html;  
      
      
    exit;  
    ###########################################################################  
    # Das menu muss noch erstellt werden  
    sub menu{  
        my $men = "<ul>";  
      
        my @menu = split(/\s+/, $u->{PBIN}->{$manager}->{menulist});  
        foreach my $m(@menu){  
            my ($item, $link) = split ":", $m;  
            my $href = ($ENV{REQUEST_URI} eq $link) ? '' : qq(href="$link");  
            $men .= qq(<li class='nav'><a $href title="$u->{PBIN}->{$link}->{title}">$item</a></li>);  
        }  
        $men .= "</ul>\n";  
      
    return <<"EOT";  
    $men  
    <hr>  
    EOT  
    }  
    
    
    1. hi,

      Kann mir jemand helfen?

      Es genügt eine Regel:

      PicoBello

      RewriteRule ^.*.htm   /cgi-bin/bello.cgi

      Mach da mal nochn $ dran
      RewriteRule ^.*.htm$   /cgi-bin/bello.cgi

      damit wird die Regel exact bei .htm angezogen, ohne $ auch bei .html was evntl. nicht gewollt ist.

      Zu den Parametern (Gefrickel):
      Es ist schon möglich, bereits in der .htaccess den REQUEST_URI so zu parsen, dass $1, $2 usw an das Rewr.Ziel (hier: bello.cgi) übergeben werden können. Das Script würde jedoch aus diesen Parametern wiederum den Path zurückermitteln und das ist "mit der Kirche ums Dorf", genau das kannst du nämlich auch im Script selbst tun aus dem REQUEST_URI, der als Umgebungsvariable zur Verfügung steht.

      In Perl würde das so aussehen:
      use URI::Split qw(uri_split);

      ($scheme, $auth, $path, $query, $frag) = uri_split($uri);

      Wobei ein REQUEST_URI so aussehen könnte:
      http://example.com/x/y/index.htm?a=1&b=2#anker
                        ^  path       ^

      und path als das was uns interessiert, ebenda zu finden ist. Path wird in einer Tabelle hinterlegt und schon kann das Script den richtigen Content dazu ausliefern, auch wenn es Parameter im Request gibt.

      Willst Du die Parameter haben, siehe oben. Hat in der RewriteRule das Ziel bereits selbst Parameter, kannst Du mit [QSA] die REQUEST-Parameter "anhängen" und aus dem GET-Array lesen, Du kommst also so oder so dran an die Parameter, am einfachsten in der Variablen $query (ohne [QSA]-Flag QUERY String Append)

      Bei QSA ist zu beachten, dass ein in der Rule fest vergebener Parameter like

      RewriteRule Quelle Ziel?q=1 [QSA]

      (hier q) im REQUEST_URI nicht berücksichtig werden kann, q ist immer =1, egal was im REQUEST_URI steht.

      Mit PHP bist Du wahsaga auf [QSA] angewiesen, was ja auch geht, bis auf die genannte Einschränkung. Als Perl-Alternative für uri_split gibts auch in PHP entsprechende Funktionen.

      Viele Grüße,
      Horst Huckepack

      --
      Schneewittchen lebt!