Spezielle Umleitung

Hallo,

ich habe ein Problemchen und zwar habe ich mittels htaccess meine URLs umgeschrieben – von bsp. www.meinedomain.de/index.php?site=home zu www.meinedomain.de/home.html

Nun möchte ich, dass, wenn man index.php?site=home aufruft, auf home.html weitergeleitet bzw. umgeleitet wird. Ist das mittels weiterer Angaben in der .htaccess möglich?

Ich bedanke mich schon jetzt für eure Antworten!

Du könntest die Aufrufe auf die index.php umleiten auf das was hinter site angegeben ist.

RewriteRule ^index.php\?site=(.*)$ $1.html [L]

musst aber gleichzeitig auch darauf achten dadurch keine Endlosschleife zu verursachen.

Danke für deine Antwort!

Das habe ich derzeit in meiner .htaccess-Datei stehen.

RewriteEngine On RewriteRule ^([^/]*)\.html$ /index.php?site=$1 [L]
Wenn ich deinen Code hinzufüge, wird leider nicht umgeleitet. Es bleibt bei der Adresse index.php?site=home.

Lies bitte genau was ich vorgeschlagen hatte.

Sorry, aber ich verstehe nicht was du mir mit deinem Codebeispiel zeigen willst. Sobald ich mein RewriteRule mit deiner URL-Umschreibung ersetzt habe, funktioniert nicht einmal mehr die Umschreibung. Wozu soll ich dann noch umleiten?

Du sollst sie nicht ersetzen sondern zu deiner RewriteRule ergänzen. Schließlich willst Du 2 verschiedene und voneinander unabhängige Dinge realisieren:

  • Umschreibung von name.html auf index.php?site=name
  • Weiterleitung von index.php?site=name auf name.html

Ersteres hast Du ja selbst hinbekommen.
Letzteres habe ich dir entworfen.

Danke schön!
Leider wird noch immer nicht umgeleitet. Wenn ich index.php?site=index eingebe, bleibt das so. Es sollte ja umleiten zu index.html.

Meine .htaccess schaut nun so aus:

RewriteEngine On RewriteRule ^([^/]*)\.html$ /index.php?site=$1 RewriteRule ^index.php\?site=(.*)$ $1.html [L]
Danke für deine Hilfe!

Schreibs mal so:

RewriteEngine On RewriteRule ^([^/]*)\.html$ /index.php?site=$1 [L] RewriteRule ^index.php\?site=(.*)$ $1.html [L,R=301]

Durch die 301 wird der HTTP-Status 301 an den Browser gesendet der daraufhin eine Weiterleitung auslösen sollte.

Geht leider noch immer nicht - bleibt index.php?site=index. Kann das vielleicht an bestimmten Einstellungen am Server liegen?
Aber vielen Dank für deine Hilfe!

Habe jetzt etwas gefunden, nur leider funktioniert das nicht so wie es beschrieben ist: .php → .html Weiterleitung - ABAKUS

RewriteCond %{THE_REQUEST} index\.php\?site=
RewriteCond %{QUERY_STRING} ^site=(.*) 
RewriteRule ^index\.php %1\.html? [R=301,L]

Doch wie gesagt, wenn ich das so einfüge, dann kann ich index.html überhaupt nicht mehr aufrufen.

Sorry für das Pushen, aber ich bin noch immer zu keiner Lösung gekommen.
Kann das wirklich an Einstellungen des Servers liegen?

Ich habe es geschafft! Es funktioniert nun so, dass wenn man index.php?site=index aufruft, auf index.html weitergeleitet wird.

RewriteEngine On

# auf www weiterleiten
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteCond %{HTTP_HOST} !^$ [NC]
RewriteRule ^(.*) http://www.%{HTTP_HOST}/$1 [L,NC,R=301]

# index.html auf / weiterleiten
RewriteCond %{THE_REQUEST} index.html [NC]
RewriteRule ^(.*)index.html(.*) /$1 [L,NC,R=301]

# Suchmaschinenfreundliche URLs
RewriteRule ^([^/]*)\.html$ /index.php?site=$1 [L,NC]

RewriteCond %{THE_REQUEST} index\.php\?site= [NC]
RewriteCond %{QUERY_STRING} ^site=(.*) [NC]
RewriteRule ^index\.php /%1.html? [L,NC,R=301]

Ich wo gelesen, dass man statt HTTP_HOST lieber SERVER_NAME verwenden und diesen validieren sollte. Hat da jemand eine Ahnung wie so etwas geht?

Habe schon angefangen, aber das funktioniert noch nicht.

RewriteCond %{SERVER_NAME} !^www\. [NC]
RewriteCond %{SERVER_NAME} ^(([a-z0-9_]+\.)+([a-z]{2,4}){1,2})$ [NC]
RewriteRule (.*) http://www.%1/$1 [L,NC,R=301]

Falls ihr den ein oder anderen Fehler (vor allem aus Sicherheitsgründen) finden solltet, so bitte ich euch mir das zu sagen, danke! Vielen Dank für eure Hilfe!

EDIT: Wann braucht man eigentlich L und NC hinter eine Zeile schreiben?

Zu Server_Name:
Chris Shiflett :black_small_square: SERVER_NAME Versus HTTP_HOST
PHP: $_SERVER - Manual

Und zu den Flags L und NC:
Apache module mod_rewrite
mod_rewrite - Apache HTTP Server

Mir ist schon klar, was die Flags bewirken, allerdings bin ich noch zu dumm, um zu wissen, wann man die einsetzen soll und wann man dies nicht muss/soll.

Danke für den Link zu Chris Shiflett, aber was soll ich denn nun benutzen? HTTP_HOST oder SERVER_NAME?

Ich habe SERVER_NAME noch nie verwendet. Ist aber dir überlassen.

[L] wenn die Rule an der das steht die letzte ist die abgearbeitet werden soll.
[NC] wenn man Groß-/Kleinschreibung auf „egal“ setzen möchte (Index.php ↔ index.php).

Ok, danke dir sehr!

Ein htaccess Validator hat in Zeile 10 einen Fehler ausgespuckt. Wüsste aber nicht was da falsch sein sollte.

RewriteRule ^(.*)index.html(.*) /$1 [L,NC,R=301]

Habe schon gedacht die Flags sind vielleicht falsch, das war es aber nicht.

Was für ein htaccess Validator?

Der hier – ein sogenannter „htaccess-Syntax-Prüfer“: Lyxx - htaccess syntax checker and validator. Lyxx - making the web work.

Weiß nicht, ob das was Vernünftiges ist, aber ich habe nur meinen Code prüfen lassen und da ist in Zeile 10 ein Fehler entdeckt worden. Ob das jetzt stimmt oder nicht, weiß ich leider nicht. Auch nicht ob das überhaupt ernst genommen werden sollte.

Was es nicht alles gibt. Sowas ist nicht nötig. htaccess-Dateien validieren bringt nichts, denn der Server führt die darin stehenden Kommandos ja schon selbst aus, sobald er die Datei findet und interpretiert. Gibt es dabei ein Problem, meldet er es.

Der Validator macht diesbezüglich aber eben keinen Sinn. Ohne zu wissen, welcher Server die htaccess liest, kann man das nicht „validieren“. Es gibt zwischen den Apache- und mod_rewrite-Versionen kleine, aber feine Unterschiede. Z.B. kann man in Apache 1.x kein # in einer RewriteRule-Zeile stehen lassen, in Apache 2.x hingegen geht das.

In deinem Fall ist in deiner RewriteRule tatsächlich noch ein Problem. Das hätte dir dein Webserver aber schon um die Ohren hauen sollen, wenn es für ihn wirklich ein Problem ist. Denn einen Punkt muss man eigentlich maskieren:

RewriteRule ^(.*)index\.html(.*) /$1 [L,NC,R=301]

Ah, danke dir! Habe ich doch glatt vergessen.

Und kann/darf ich jetzt den HTTP_HOST weiterverwenden? Muss ich HTTP_HOST validieren/checken, ob das ein gültiger Wert ist. Aber ich speichere ja diesen Wert nicht z.B. in einer Datenbank – der Wert dient ja nur zur Weiterleitung. Was könnte denn passieren, wenn der HTTP_HOST-Eintrag manipuliert wird?