.htacces Mod-Rewrite Problem
celly123
- sonstiges
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
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
hi,
Kann mir jemand helfen?
Es genügt eine Regel:
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
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
}
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