Seite 1 von 1

HILFE - .html Datei als Ordner (/ordner/) umschreiben

Verfasst: 13.03.2012, 17:43
von SeriousBadMan
Hallo,

ich brauche dringend Hilfe. Und habe leider keine Ahnung von Mod_Rewrite.

Und zwar habe ich eine Website wo alle Pages (inkl. der Index) in einem bestimmten Verzeichnis liegen. Es handelt sich dabei um html-Dateien.

Diese möchte ich gerne mithilfe von mod-rewrite von datei.html in /datei/ verwandeln (außer die index.html, die soll bleiben wie sie ist). Ich habe dazu diesen Code benutzt:

RewriteEngine On
RewriteRule ^/([^.]+)/$ $1.html?rw=1 [QSA,L]
RewriteCond %{QUERY_STRING} !^rw=1
RewriteRule ^([^.]+)\.html$ /$1/ [R=301,L]

Das scheint aber nur eine Weiterleitung zu sein, die auf die /datei/ weiterleitet. Die Weiterleitung klappt und dann kommt ein 404 weil die /datei/ nicht vorhanden ist.

Wie löse ich das Problem? Wie simuliere ich, dass der Ordner doch vorhanden ist?


(nach Möglichkeit mit Mod_Rewrite... :-) händisch Ordner anzulegen und zu benennen und dort die jeweiligen Dateien als index.html zu hinterlegen ist mir auch schon gekommen, scheint mir aber sehr aufwendig und wenig elegant)

Verfasst:
von

Hochwertiger Linkaufbau bei ABAKUS:
  • Google-konformer Linkaufbau
  • nachhaltiges Ranking
  • Linkbuilding Angebote zu fairen Preisen
  • internationale Backlinks
Wir bieten Beratung und Umsetzung.
Jetzt anfragen: 0511 / 300325-0

Verfasst: 13.03.2012, 20:13
von Melegrian
Bleibt wie sie ist: "https://www.example.com/index.html"
Aufruf nicht möglich: "https://www.example.com/index/"

Bei Aufruf von

"https://www.example.com/testseite/"
"https://www.example.com/pflaumenmus/"
"https://www.example.com/apfel-birnen/"

werden die Seiten geladen:

"https://www.example.com/testseite.html"
"https://www.example.com/pflaumenmus.html"
"https://www.example.com/apfel-birnen.html"

Code: Alles auswählen

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/index(.*)$
RewriteRule ^(.+)/$ /$1.html [L]
Und viel mehr ist das erst einmal nicht.

Verfasst: 13.03.2012, 22:27
von see-you
Mist...Thema schon gelöst. Den Link hätte ich mir gern verdient.

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Verfasst: 13.03.2012, 23:07
von chris21
Moin,

der Code

Code: Alles auswählen

RewriteEngine On
RewriteRule ^/([^.]+)/$ $1.html?rw=1 [QSA,L]
RewriteCond %{QUERY_STRING} !^rw=1
RewriteRule ^([^.]+)\.html$ /$1/ [R=301,L] 
ist schon richtig und nutzt einen bestimmten Trick, um bei so einer Konstellation eine Endlosschleife zu verhindern.

Das derzeitige Problem liegt daran, dass Dein Apache vermutlich so konfiguriert ist, dass er keinen symbolischen Links folgt. Daher der 404 bei /ordner/

Lösung:

Code: Alles auswählen

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^/([^.]+)/$ $1.html?rw=1 [QSA,L]
RewriteCond %{QUERY_STRING} !^rw=1
RewriteRule ^([^.]+)\.html$ /$1/ [R=301,L] 
Und einmal zur Erläuterung Zeile für Zeile:

Code: Alles auswählen

Options +FollowSymLinks
Einer RewriteRule wird gefolgt, auch wenn das Ziel keine reale Datei oder Ordner darstellt

Code: Alles auswählen

RewriteEngine on
mod_rewrite wird aktiviert.

Code: Alles auswählen

RewriteRule ^/([^.]+)/$ $1.html?rw=1 [QSA,L]
Beim Aufruf eines Ordners wird auf eine Datei umgeleitet, wobei Ordnernamen dem Dateinamen entspricht. Ein möglicher Query String wird angehängt (durch das Flag QSA), zugleich wird jedoch - als Trick - der Parameter rw=1 in den Query String eingefügt. Da dies ein interner Rewrite ist, ist sie vom Nutzer nicht sichtbar, für ihn bleibt /name/ in der URL bestehen, es wird lediglich der Inhalt aus name.html?rw=1 geholt und angezeigt.

Code: Alles auswählen

RewriteCond %{QUERY_STRING} !^rw=1
Für die nächste RewriteRule wird zunächst überprüft, dass der Parameter rw=1 im Query String nicht gesetzt ist. Dies ist wichtig, da sonst die folgende Regel auch auf die eben zuvor umgeschriebene interne URL angewendet werden würde und damit zu einer Endlosschleife führen würde.

Code: Alles auswählen

RewriteRule ^([^.]+)\.html$ /$1/ [R=301,L] 
Nun wird das Legacy Problem gelöst. Bisher waren die Dateien ja unter name.html publiziert. Aufrufe auf diese Dateien werden nun als externer Redirect per 301 moved permanently auf /name/ umgeleitet, so dass für den Nutzer (und Bots) die neue URL erscheint und somit zugleich interner DC vermieden sowie der alte Linkhjuice auf die neuen URLs geleitet wird.

Verfasst: 14.03.2012, 05:36
von Melegrian
chris21 hat geschrieben:

Code: Alles auswählen

RewriteEngine On
RewriteRule ^/([^.]+)/$ $1.html?rw=1 [QSA,L]
RewriteCond %{QUERY_STRING} !^rw=1
RewriteRule ^([^.]+)\.html$ /$1/ [R=301,L] 
Hat bei mir unter Localhost auch geärgert, jedoch nicht wegen den symbolischen Links.

Vorgenommene Änderungen:

Bei der erste Rule den ersten Schrägstrich entfernt, dafür einen Schrägstrich vor $1 eingefügt und bei der Cond das Muster mit $ beendet.

Code: Alles auswählen

RewriteEngine on

RewriteRule ^([^.]+)/$ /$1.html?rw=1 [QSA,L]
RewriteCond %{QUERY_STRING} !^rw=1$
RewriteRule ^([^.]+)\.html$ /$1/ [R=301,L] 
Mit Berücksichtigung der index.html sieht es nun so aus:

Code: Alles auswählen

RewriteEngine on 

RewriteRule ^([^.]+)/$ /$1.html?rw=1 [QSA,L]
RewriteCond %{QUERY_STRING} !^rw=1$
RewriteCond %{REQUEST_URI} !^/index\.html$ 
RewriteRule ^([^.]+)\.html$ /$1/ [R=301,L]
Bei mir stellt sich allgemein eine ganz andere Frage. Durch diese Umschreibung und Weiterleitung in beiden Richtungen ändern sich ja nicht die Links im Quelltext und wie wirkt sich das auf Ranking aus, wenn da nur per htaccess die URLs von 100 oder 300 Seiten umgeschrieben und weitergeleitet werden, ohne dass die Links im Quelltext dieser 100 oder 300 Seiten zu finden sind?

Also, die Seiten werden zwar über ähnliche URLs aufgerufen,

"https://www.example.com/pflaumenmus/"
"https://www.example.com/apfel-birnen/"

doch im Quelltext steht ja immer noch:

Code: Alles auswählen

<a href="pflaumenmus.html">Pflaumenmus</a>
<a href="apfel-birnen.html">apfel-birnen</a>
Wäre es da nicht richtiger, allein schon wegen der internen Vererbung, auch sämtliche Links im Quelltext anzupassen, anstatt alles nur durch Umschreibung und Weiterleitung regeln zu wollen?

Verfasst: 14.03.2012, 10:53
von chris21
Ja, ganz sicher.

Die Umleitung ist nur für die alten bereits im Index befindlichen Links sowie Backlinks.

Verfasst: 14.03.2012, 15:07
von SeriousBadMan
Also, ich habe sowohl Melegrians als auch Chris Lösung ausprobiert (die 2./ganz unten von Melegrian allerdings nicht mehr).

Offenbar funktioniert (bei mir) die Lösung die ich ursprünglich hatte auch mit Chris Zusatz nicht.

Nach einigem Hin- und Her mit dem Support meines Hosts funktioniert schließlich der Code von Melegrian mit einer Erweiterung meines Hosts:

Code: Alles auswählen

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %&#123;REQUEST_URI&#125; !^/index&#40;.*&#41;$
RewriteRule ^&#40;.+&#41;/$ /$1.html &#91;L&#93;
</IfModule> 
Die Links in den Dateien habe ich übrigens auch alle geändert, einfach mit Suchen & Ersetzen den absoluten Pfad in alle Dateien reingehauen, mit relativem wär's zu aufwendig gewesen.

Frage @Melegrian Ist die Lösung irgendwie schlechter als die Lösung die du ganz unten genannt hast, oder kann ich das so lassen?

Kannst mir gerne deinen Linkwunsch (per PM) zuschicken, dann kann ich mal sehen, wo ich den unterbringen könnte :-)

Danke auch an Chris für die Mühe! Klappte leider nicht bei mir!

PS:

Ich hab noch das hier reingebaut:

Code: Alles auswählen

ErrorDocument 404 http&#58;//www.domain.net/index.html
<IfModule mod_rewrite.c>
ErrorDocument 404 http&#58;//www.domain.net/index.html
RewriteEngine on

RewriteCond %&#123;REQUEST_URI&#125; !^/index&#40;.*&#41;$
RewriteRule ^&#40;.+&#41;/$ /$1.html &#91;L&#93;
RewriteCond %&#123;HTTP_HOST&#125; ^&#40;&#91;^.&#93;+&#41;.&#40;de&#41;
RewriteRule ^&#40;.*&#41; http&#58;//www.%1.%2/$1 &#91;R=301,L&#93;
RewriteCond %&#123;THE_REQUEST&#125; ^&#91;A-Z&#93;&#123;3,9&#125;\ /index\.&#40;html?|php&#41;\ HTTP/
RewriteRule ^index\.&#40;html?|php&#41;$ http&#58;//www.domain.net/ &#91;R=301,L&#93;
</IfModule> 
Soll bewirken dass nicht mehr existierende Seiten über den Umweg einer 404er Seite (die index ist meine 404) auf die Startseite geleitet werden. Tut's anscheinend auch, aber wenn ich Server Header Check Tools nutze, anscheinend per 302 statt 301? Weiss jemand vlt. warum?

Verfasst: 14.03.2012, 15:11
von chris21
Hi,

die Lösung, die Du nun eingebaut ist, ist schon hilfreich, hat aber ein Problem, falls die alten Links mit name.html bereits im index sind oder Links darauf zeigen. Denn diese alten Links werden nun nicht umgeleitet auf die neue Struktur.

Daher würde ich folgendes empfehlen, die 2. korrekte Lösung von Melegrian doch noch einmal zu testen. Die macht nämlich alles richtig ;)

Also folgende Version:

Code: Alles auswählen

<IfModule mod_rewrite.c> 
RewriteEngine on

RewriteRule ^&#40;&#91;^.&#93;+&#41;/$ /$1.html?rw=1 &#91;QSA,L&#93;
RewriteCond %&#123;QUERY_STRING&#125; !^rw=1&#40;.*&#41;$
RewriteCond %&#123;REQUEST_URI&#125; !^/index\.html$
RewriteRule ^&#40;&#91;^.&#93;+&#41;\.html$ /$1/ &#91;R=301,L&#93;
</IfModule>

Verfasst: 14.03.2012, 15:17
von SeriousBadMan
Ah, das ist kein Problem, die sind nicht im Index :-) Danke dir!

(die name.html sind ja die eigentlich neuen Links des statischen HTML... vorher war da Wordpress und das hatte eben Ordnerstruktur und die wollte ich simulieren daher...)