Umleiten ohne Redirect?
Cyx23
- webserver
Hallo,
ich möchte gerne einen Link auf so nicht existierende Verzeichnisse bzw.
Dateien ermöglichen.
Also die Pfadanzeige im Browser beibehalten und dabei den Inhalt eines
anderen Verzeichnisses anzeigen.
Z.B.:
www.example.com/jahre/2008 existiert, www.example.com/fotos/2008 existiert
auch.
"fotos/2008" soll aber nun unter www.example.com/jahre/2008/fotos angezeigt
werden.
So komme ich immerhin an den richtigen Inhalt:
RewriteRule ^ausstellungen/(.*)$ /fotos/$1 [L,R]
Allerdings lautet die Pfadanzeige im Browser www.example.com/fotos
/2008/fotos, und der Header mit dem erkennbaren Redirect bzw. 302 ist auch
nicht erwünscht.
Der Ansatz mit dem Redirect ist anscheinend gar nicht so gut, welche
Möglichkeiten gibt es noch?
Grüsse
Cyx23
Hallo,
Lass das R-Flag weg. Das verursacht nämlich den HTTP-Redirect ;-) Ohne das Flag wird ein sog. interner Redirect verwendet, dass heisst, der Browser bekommt davon nichts mit (weil nichts davon über HTTP gesendet wird), aber der Server ruft intern die andere Adresse auf.
Abgesehen davon, passt dein RegEx nicht zu den Beispielen (www.example.com/...).
Gruß
Hallo,
Abgesehen davon, passt dein RegEx nicht zu den Beispielen (www.example.com/...).
sorry, ein copy & pray Versehen.
Sollte wohl so ausschauen:
RewriteRule ^jahre/(.*)$ /fotos/$1 [L,R]
Lass das R-Flag weg. Das verursacht nämlich den HTTP-Redirect ;-) Ohne das Flag wird ein sog. interner Redirect verwendet, dass heisst, der Browser bekommt davon nichts mit (weil nichts davon über HTTP gesendet wird), aber der Server ruft intern die andere Adresse auf.
Das hatte ich schon ohne Erfolg versucht.
Grüsse
Cyx23
Hallo,
Das hatte ich schon ohne Erfolg versucht.
Versuche mal das:
RewriteRule ^jahre/(.*)$ fotos/$1 [L]
^
Kein "/", weil dass eine absolute Adresse wäre, was laut Dokumentation zu einem externen Redirect führt, wenn die Rewrite-Rule nicht in der Hauptkonfiguration liegt (oder so ähnlich...)
Gruß
Hallo,
Kein "/", weil dass eine absolute Adresse wäre, was laut Dokumentation zu einem externen Redirect führt, wenn die Rewrite-Rule nicht in der Hauptkonfiguration liegt (oder so ähnlich...)
Das war mal wieder absoluter Quark, den ich da verzapft habe........ Nur eine URI der Form http://www.example.net/blabla (also mit Host) sorgt automatisch für einen Redirect - sofern es ein anderer Host als der aktuelle ist.
/blabla ist nur absolut bezogen auf den aktuellen Host und sorgt damit _nicht_ für einen externen Redirect, wenn kein [R]-Flag angegeben ist.
Gruß
echo $begrüßung;
Das hatte ich schon ohne Erfolg versucht.
Keinen Erfolg kann man auf unterschiedlichste Art und Weise haben. Welche war das bei dir genau?
echo "$verabschiedung $name";
Hallo,
Keinen Erfolg kann man auf unterschiedlichste Art und Weise haben. Welche war das bei dir genau?
Ein Link auf www.example.com/jahre/2008/fotos zeigt in der Adressleiste
www.example.com/jahre/2008/fotos an, Inhalt ist aber www.example.com/jahre/2008.
Vielleicht geht es auch deshalb nicht, weil Textpattern die Pfade "simuliert".
So schaut es noch in der weiteren .htaccess aus:
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]
RewriteRule ^(.*) index.php
Grüsse
Cyx23
echo $begrüßung;
Keinen Erfolg kann man auf unterschiedlichste Art und Weise haben. Welche war das bei dir genau?
Ein Link auf www.example.com/jahre/2008/fotos zeigt in der Adressleiste
www.example.com/jahre/2008/fotos an, Inhalt ist aber www.example.com/jahre/2008.
Vielleicht geht es auch deshalb nicht, weil Textpattern die Pfade "simuliert".
Spekulieren bringt es meist nicht. Hast du die Möglichkeit, ein RewriteLog einzuschalten (RewriteLogLevel auf 9 setzen)? Dazu benötigst du aber administrativen Zugriff auf den Webserver. Allerdings kannst du dann jeden Schritt des Umschreibprozesses genau verfolgen und siehst dann an welcher Selle die tatsächliche Arbeitsweise von der vorgestellten abweicht.
echo "$verabschiedung $name";
Hallo,
Allerdings kannst du dann jeden Schritt des Umschreibprozesses genau verfolgen und siehst dann an welcher Selle die tatsächliche Arbeitsweise von der vorgestellten abweicht.
Das schaut auf den ersten Blick nicht ganz so übersichtlich aus :)
Am Anfang:
rewrite 'jahre/2008/fotos' -> 'fotos/2008/fotos'
Da ist immer noch das unnötige zweite "fotos", aber sonst schaut es eigentlich vom Log her wohl noch gut aus.
Später taucht dann aber 'index.php/2008/fotos' auf, vmtl. ist da der Fehler:
add path info postfix: /fotos -> /fotos/2008/fotos
strip per-dir prefix: /fotos/2008/fotos -> fotos/2008/fotos
rewrite 'fotos/2008/fotos' -> 'index.php'
add per-dir prefix: index.php -> /index.php
add path info postfix: /index.php -> /index.php/2008/fotos
Vielleicht hätte da eher index.php/fotos/2008 rauskommen sollen?
Grüsse
Cyx23
echo $begrüßung;
Das [RewriteLog] schaut auf den ersten Blick nicht ganz so übersichtlich aus :)
Das stimmt, verfall aber bitte nicht darauf, dir nur die Rosinen rauszupicken. Beim Fehlersuchen ist alles wichtig.
Trockenschwimmen ist nicht immer von Vorteil, weswegen ich mal versucht habe, das Problem nachzustellen. Aber das gelang mir nicht.
Gegeben sind
/index.php
/jahre/2008/test.txt
/fotos/2008/index.php
/fotos/2008/test.txt
sowie zwei .htaccess
/.htaccess
RewriteRule ^jahre/(.*)$ /fotos/$1
/fotos/2008/.htaccess
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]
RewriteRule ^(.*) index.php
oder auch
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) index.php
Ein Aufruf von /jahre/2008/beliebig führt stets zu /fotos/2008/beliebig. Da wirkt die zweite .htaccess und schreibt das Ergebnis der ersten auf die /fotos/2008/index.php um. Wenn 'beliebig' 'fotos/test.txt' ist, ergibt /fotos/2008/fotos/test.txt keine existierende Datei, weswegen die Umschreibung nach index.php zieht.
Vielleicht willst du eher in der ersten .htaccess ein
RewriteRule ^jahre/(.*)/fotos/(.*)$ /fotos/$1/$2
stehen haben. Damit wird die existierende /fotos/2008/test.txt beim Aufruf von /jahre/2008/fotos/test.txt gefunden. Auch /jahre/2008/test.txt findet sein Ziel.
Wenn du was anderes haben möchtest, bitte ich um eine vollständig nachvollziehbare Aufstellung aller beteiligten Dateien und Verzeichnisse und der Inhalte der .htaccess. Denn möglicherweise habe ich beim Zusammentragen der Informationen nochwas übersehen.
echo "$verabschiedung $name";
Hallo,
danke für Deine Arbeit, leider "funzt" es so noch nicht.
Wenn du was anderes haben möchtest, bitte ich um eine vollständig nachvollziehbare Aufstellung aller beteiligten Dateien und Verzeichnisse und der Inhalte der .htaccess.
Die (eine) .htaccess schaut so aus:
#DirectoryIndex index.php index.html
#Options +FollowSymLinks
#Options -Indexes
<IfModule mod_rewrite.c>
RewriteEngine On
#RewriteBase /relative/web/path/
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]
RewriteRule ^(.*) index.php
RewriteCond %{HTTP:Authorization} !^$
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]
</IfModule>
#php_value register_globals 0
Die Ergänzungen habe ich nach RewriteEngine On
platziert.
Also z.B.:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} /fotos
RewriteRule ^jahre/(.*)$ /fotos/$1 [L,R]
#RewriteBase /relative/web/path/
Bei Textpattern existieren keine echten Dateien und Verzeichnisse.
Als Verzeichnisse können die "Sektionen" betrachtet werden, also
www.example.com/fotos
www.example.com/jahre
Dateien oder "Artikel" sind z.B. die beiden 2008:
www.example.com/fotos/2008
www.example.com/jahre/2008
Da es keine Sub-Sections o.ä. gibt und ich trotzdem eine solche Struktur
wünsche, möchte ich bei zusätzlicher Angabe von fotos, also
www.example.com/jahre/2008/fotos, auf (den Inhalt) /fotos/2008 umleiten
(ohne erkennbaren redirect), und die Adresse /jahre/2008/fotos beibehalten.
Grüsse
Cyx23
Hallo,
Ah, ich habe eine Erleuchtung: Du hast gesagt, wenn du /jahre/2008/fotos aufrufst, wird der Inhalt von /jahre/2008 angezeigt? Der "Fehler" liegt bei Textpattern. Dein Redirect wird ordnungsgemäss durchgeführt, aber RewriteRule ^(.*) index.php
leitet alles auf die index.php von Textpattern um. Dieses ermittelt die aufgerufene Seite wahrscheinlich mit $_SERVER['REQUEST_URI']
. Hier steht allerdings immer die ursprüngliche, vom Client angeforderte Adresse.
Vielleicht kann man Textpattern die Zieladresse auch per GET-Parameter übergeben, aber die original .htaccess-Datei hat mich auf eine Idee gebracht. Probiere mal das direkt nach deiner eigenen RewriteRule einzufügen:
RewriteRule ^(.*) - [E=REQUEST_URI:$1]
Sofern man $n in einem Flag benutzen kann und Textpattern tatsächlich REQUEST_URI verwendet...
Noch ein kleiner Hinweis: Du hast in deinem Post RewriteCond %{REQUEST_URI} /fotos
angegeben, aber ich glaube, das war wieder mal so nicht gedacht ;-)
Gruß
Hallo,
Dein Redirect wird ordnungsgemäss durchgeführt, aber
RewriteRule ^(.*) index.php
leitet alles auf die index.php von Textpattern um.
rewrite.log läßt so etwas m.E. auch vermuten.
Mir war nur nicht klar, dass sich dieses "alles" vorher offenbar nur durch
einen Redirect ändern läßt.
RewriteRule ^(.*) - [E=REQUEST_URI:$1]
Klappt leider nicht.
Noch ein kleiner Hinweis: Du hast in deinem Post
RewriteCond %{REQUEST_URI} /fotos
angegeben, aber ich glaube, das war wieder mal so nicht gedacht ;-)
Wieso nicht?
Grüsse
Cyx23
Hallo,
RewriteRule ^(.*) - [E=REQUEST_URI:$1]
Klappt leider nicht.
Letzter Versuch:
<IfModule mod_rewrite.c>
RewriteEngine On
#RewriteBase /relative/web/path/
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]
RewriteRule ^jahre/([0-9]{4,4})/fotos$ /fotos/$1
RewriteRule ^(.*) index.php [E=REQUEST_URI:$1]
RewriteCond %{HTTP:Authorization} !^$
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]
</IfModule>
Man beachte u. a. die geänderte Reihenfolge. Ausserdem habe ich deine Rule etwas geändert, ich glaube das wolltest du damit erreichen:
Noch ein kleiner Hinweis: Du hast in deinem Post
RewriteCond %{REQUEST_URI} /fotos
angegeben, aber ich glaube, das war wieder mal so nicht gedacht ;-)Wieso nicht?
[E=REQUEST_URI:$1] funktioniert auf jeden Fall bei mir (gerade getestet - allerdings ohne Textpattern).
Gruß
Hallo,
klappt nicht.
So ist immerhin beim redirect das überflüssige zweite "/fotos" weg,
hab es mal mit (.*) hoffentlich etwas flexibler, aber richtig umgesetzt:
RewriteRule ^jahre/(.*)/fotos$ /fotos/$1 [L,R]
Ohne das [L,R] "passiert nichts" und so schaut es -etwas gekürzt- im
rewrite.log aus:
rewrite 'jahr/2008/fotos' -> '/fotos/2008'
add path info postfix: /fotos/2008 -> /fotos/2008/2008/fotos
applying pattern '^(.*)' to uri '/fotos/2008/2008/fotos'
rewrite '/fotos/2008/2008/fotos' -> 'index.php'
'REQUEST_URI' to '/fotos/2008/2008/fotos'
add per-dir prefix: index.php -> .. /index.php
add path info postfix: /index.php -> /index.php/2008/fotos
strip per-dir prefix: /index.php/2008/fotos -> index.php/2008/fotos
applying pattern '.*' to uri 'index.php/2008/fotos'
RewriteCond: input='' pattern='!^$' => not-matched
strip document_root prefix: .. /index.php -> /index.php
internal redirect with /index.php [INTERNAL REDIRECT]
strip per-dir prefix: /index.php -> index.php
applying pattern '^(.+)' to uri 'index.php'
RewriteCond: input=' .. /index.php' pattern='-f' => matched
forcing ' .. /index.php' to get passed through to next API URI-to-filename handler
initial URL equal rewritten URL: .. /index.php [IGNORING REWRITE]
Grüsse
Cyx23
Hallo,
Es geht wirklich nicht, genauso wenig wie das Setzen der Umgebungsvariable (Denkfehler im Test) :-( Dafür habe ich einen Bug-Bericht gefunden, der auf das Problem zutrifft. Ich denke nicht, dass das Verhalten hier absichtlich ist. mod_rewrite ist wirklich etwas vertracktes.
Tut mir leid für das ganze nicht funktionierende Zeugs.
Gruß
Hallo,
Dafür habe ich einen Bug-Bericht gefunden, der auf das Problem zutrifft. Ich denke nicht, dass das Verhalten hier absichtlich ist.
Das schaut allerdings heftig aus, schade.
Ein passendes plug-in für Textpattern schreiben ist auch etwas aufwändig, dann muss es wohl doch bei den anderen Pfaden bleiben.
mod_rewrite ist wirklich etwas vertracktes.
Und m.E. auch etwas knapp und mit wenig Beispielen dokumentiert.
Grüsse aus Düsseldorf
Cyx23
echo $begrüßung;
mod_rewrite ist wirklich etwas vertracktes.
Und m.E. auch etwas knapp und mit wenig Beispielen dokumentiert.
Das halte ich für ein Gerücht. Im Apache-Handbuch befindet irgendwo unter den Modulen auch mod_rewrite. Wenn man über die Direktiven sucht, kommt man auch an diese Seite. Dort steht zu Anfang ein Verweis zu detailed mod_rewrite documentation. Diese verlinkt auf 4 weitere Seiten zu mod_rewrite. Zwei davon haben jede Menge Beispiele. Verweise zu diesen beiden Seiten sind auch im Abschnitt Practical Solutions der oben erwähnten mod_rewrite-Modul-Beschreibung zu finden.
echo "$verabschiedung $name";
Hallo,
Zwei davon haben jede Menge Beispiele. Verweise zu diesen beiden Seiten sind auch im Abschnitt Practical Solutions der oben erwähnten mod_rewrite-Modul-Beschreibung zu finden.
Eine gute Idee die Seiten nochmal hier zu verlinken.
Aber die Beispiele waren mir bekannt, ich fand die Dokumentation dennoch
unbefriedigend. Und falls mein doch im Ansatz eigentlich einfaches Vorhaben
tatsächlich aufgrund eines Bugs nicht realisierbar ist, müßten solche Probleme
m.E. auch auf hinreichend prominenten Seiten ordentlich beschrieben werden.
Und leider finde ich einige als Ergänzung interessante mir bekannte Seiten
nicht mehr per Google, sondern bekomme nur noch Einheitsbrei angezeigt.
Entweder ein grundlegendes Problem solcher Suchmaschinen, oder die betr.
Seiten sind gar nicht mehr online.
Grüsse
Cyx23
Hallo Cyx23,
du könntest per .htaccess
<Files .htaccess>
order allow,deny
deny from all
</Files>
<Files index>
ForceType application/x-httpd-php
</Files>
dafür sorgen, dass bei Unklarheiten immer die index.php angesprochen wird.
In der index.php oder einer Config-Datei, könntest du über sowas
/*---------------- Dokument-Verlinkungen -------------------*/
$erg = explode("/", $_SERVER['REQUEST_URI']);
$act_site = trim(htmlentities(strip_tags($erg[1])));
if (empty($inhalt1)) $inhalt1 = trim(htmlentities(strip_tags($erg[2])));
if (empty($inhalt2)) $inhalt2 = trim(htmlentities(strip_tags($erg[3])));
if (!preg_match('=[1]*$=i', $inhalt1)) unset($inhalt);
if (!preg_match('=[2]*$=i', $inhalt2)) unset($inhalt2);
/*---------------- Dokument-Verlinkungen -------------------*/
die URL in ihre Bestandteile zerlegen und Werte als Variablen verarbeiten.
So laufen bei mir fast alle Seiten, um Verlinkungen möglichst kurz, aber dennoch aussagekräftig zu halten...
Diese Handhabung kann dir unter Umständen bei dem weiterhelfen, was du suchst. Denk dran, wenn aber alle anderen Verlinkungen wie z.B. Grafiken zum Ursprung zu verlinken... also meist ala src="/images/", da der Browser hierbei sonst versucht diese relativ zum "angeblichen" Verzeichnis der URL zu suchen.
Gruß Patrick
Hallo Patrick,
dafür sorgen, dass bei Unklarheiten immer die index.php angesprochen wird.
das sieht eigentlich gut aus, aber leider soll hier bei einem CMS ('txp') nachgebessert werden, ohne index.php etc. zu verändern.
Grüsse
Cyx23