mod_rewrite Datei zu Ordner

  • Huhu

    ich stelle fest, das seit dem Umzug auf den neuen Server google sich irgendwie auch die "Stammdatei" geholt hat..

    Wenn der Ordner "auto/" aufgerufen wird, werden die Inhalte der auto.php ausgeliefert.
    RewriteRule ^auto/ /auto.php [L]

    funktionierte bis jetzt einwandfrei. Nun hat sich google die auto.php von sonst wo her geholt.. und entsprechen stimmt kein Pfad mehr von den da verlinkten Seiten - laute 404 in Webmastertools

    Nun dachte ich das es mit einem 301 erledigt sein müsste..

    RewriteRule ^auto.php /auto/ [R=301,L]


    aber so leitet der Server endlos um?!


    Grüße Yury

  • Das endlos umleiten ist korrekt, da Du ja einmal sagst, wenn /auto/, dann rufe die /auto.php ab, aber dann auch sagst, wenn /auto.php, dann rufe die /auto/ ab. Das ist das Endlosspiel.

    Ansätze gibt es da mehrere, zwei mal dazu.

    Du nimmst etwas wie das hier

    Apache Configuration
    RewriteRule ^auto/ /auto.php?intern=1 [L]

    Das stört Dein Script nicht, wenn es den Parameter "intern" nicht sonst schon gibt. Kann man aber nennen wie man mag.

    Bei der Weiterleitung prüfst Du dann, ob der Parameter vorhanden ist oder nicht. Wenn ja, dann war es ein interner Request und er darf nicht weiterleiten, wenn nein, dann war es ein direkter Zugriff und er muss weiterleiten.

    Apache Configuration
    RewriteCond %{QUERY_STRING} !intern=1
    RewriteRule ^auto.php /auto/ [R=301,L]

    ** Ungetestet ** aber so in der Art sollte es gehen.

    Oder Möglichkeit zwei: Du packst die eigentlichen .php-Files in einen Unterordner. Mache ich bei mir etwa so, aus dem Gleichen Grund. Alle Core-Files also in einen /unterordner/ und den /unterordner/ dann für den Zugriff sperren. Die Rules funktionieren dann dennoch, denn die Sperre greift nur auf HTTP-Ebene, die Rules arbeiten aber auf Dateiebene.

    Apache Configuration
    RewriteRule ^auto/ /ordner/auto.php [L]


    Und "Ordner" dann sperren.

    Code
    <Location /ordner>
     Order deny,allow
     Deny from all
    </Location>


    Allerdings brauchst Du hier dann auch die Berechtigung, Location und Order verändern zu dürfen.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Huhu

    grml.. irgendwie bin ich nicht fähig es auf ein anderes Beispiel zu transferieren..

    Apache Configuration
    RewriteRule ^presse/sitemap-meldungen-([0-9]*)\.html$ /presse.php?do=sitemap&page=$1 [L]
    RewriteRule ^presse/([0-9]*)/(.*)\.html$ /presse.php?newsid=$1 [L]
    RewriteRule ^presse/$ /presse/sitemap-meldungen-1.html [L,R=301]

    so funktioniert es..


    nun möchte ich noch den direkten Zugriff auf die presse.php ebenfalls auf die Sitemap-Seite leiten..

    Apache Configuration
    #RewriteCond %{QUERY_STRING} !do  [or]
    #RewriteCond %{QUERY_STRING} !newsid 
    #RewriteRule ^presse.php$ /presse/sitemap-meldungen-1.html [L,R=301]

    und schon wieder ist die Endlosschleife eingebaut.. :floet:

  • Ist so aber auch wieder etwas logisch und fällt eher in den Bereich Mathematik bzw. logisches Denken :)

    #RewriteCond %{QUERY_STRING} !do [or]
    #RewriteCond %{QUERY_STRING} !newsid

    Also wenn nicht "do" oder nicht "newsid". Trifft somit auf /presse.php?do=sitemap&page=$1 zu, da dort newsid nicht vorkommt. Trifft auch zu auf /presse.php?newsid=$1, da do nicht vorkommt.

    Also entweder nicht "oder", sondern "and" (default - muss man nicht angeben), oder, wenn die presse.php immer einen Parameter hat, dann den einfach abfragen. Also wenn die ohne Parameter gar nicht aufgerufen werden darf, dann einfach so.

    Apache Configuration
    RewriteCond %{QUERY_STRING} ^$
    RewriteRule ^presse.php$ /presse/sitemap-meldungen-1.html [L,R=301]

    ! = nicht
    ^ = Anfang
    $ = Ende.

    Da wischen Anfang und Ende nichts weiteres steht heißt das also, "wenn nichts zwischen Anfang und Ende (leer)".

    ** Ebenfalls ungetestet **

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Zitat von Synonym;8231

    Ist so aber auch wieder etwas logisch und fällt eher in den Bereich Mathematik bzw. logisches Denken :)

    #RewriteCond %{QUERY_STRING} !do [or]
    #RewriteCond %{QUERY_STRING} !newsid

    Also wenn nicht "do" oder nicht "newsid". Trifft somit auf /presse.php?do=sitemap&page=$1 zu, da dort newsid nicht vorkommt. Trifft auch zu auf /presse.php?newsid=$1, da do nicht vorkommt.

    ohh, mann, natürlich :)

    ist ja wie bei einer php if abfrage mit &/|| die mehrere Konditionen vergleicht..


    Zitat von Synonym;8231

    Also entweder nicht "oder", sondern "and" (default - muss man nicht angeben), oder, wenn die presse.php immer einen Parameter hat, dann den einfach abfragen. Also wenn die ohne Parameter gar nicht aufgerufen werden darf, dann einfach so.

    Apache Configuration
    RewriteCond %{QUERY_STRING} ^$
    RewriteRule ^presse.php$ /presse/sitemap-meldungen-1.html [L,R=301]

    ! = nicht
    ^ = Anfang
    $ = Ende.

    Da wischen Anfang und Ende nichts weiteres steht heißt das also, "wenn nichts zwischen Anfang und Ende (leer)".

    jup, ist nun klar

    Zitat von Synonym;8231

    ** Ebenfalls ungetestet **

    funktioniert ebenfalls ;)


    DANKE