Cyx23: Umleiten ohne Redirect?

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

  1. 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ß

    1. 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

      1. 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ß

        1. 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ß

      2. 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";

        1. 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

          1. 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";

            1. 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

              1. 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";

                1. 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

                  1. 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ß

                    1. 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

                      1. 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ß

                        1. 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

                          1. 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ß

                            1. 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

                              1. 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";

                                1. 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

  2. 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


    1. 0-9a-z-_&?=., ↩︎

    2. 0-9a-z-_&?=., ↩︎

    1. 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