• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

URL-Rewrite mit mehreren GET- Parametern

Degers

Mitglied
Hallo,

Per .htaccess möchte ich eine auf GET-Parametern basierende Websitestruktur eine virtuelle Serverstruktur verpassen. Einige mögliche Fälle im Projekt:
HTML:
website.de/?page=eineseite
website.de/?page=eineseite&tab=eintab
website.de/?page=eineseite&tab=eintab&eineanderevariable=blub
Grundsätzlich gibt es, von der Indexseite abgesehen, stehts eine Seite und gelegentlich weitere Parameter
Mit folgender .htaccess wandle ich die Domain von "website.de?page=eineseite" zu "website.de/eineseite":
HTML:
RewriteEngine On
RewriteBase /
RewriteRule ^([0-9a-zA-Z]+)$ index.php?page=$1

Nun sind zwei Szenarien akzeptabel:
Entweder bleibt es bei der Umwandlung des Page-Parameters und andere Parameter werden "wie üblich" per GET angehängt und abgerufen. Problem dabei ist derzeit dass ich mit diesem Rewrite keinen Zugriff mehr auf die anderen Parameter habe, ein 404er ausgegeben wird.
Die andere Möglichkeit ist, dass auch die anderen Parameter umgewandelt werden, daher bspw "website.de/eineseite/eintab/blub".

Die Materie ist absolutes Neuland für mich, das noch als Hinweis. Danke im Vorraus für eventuelle Hinweise.
 
Werbung:
Die andere Möglichkeit ist, dass auch die anderen Parameter umgewandelt werden, daher bspw "website.de/eineseite/eintab/blub".

So mache zumindest ich das. Bei mir ist das dann zB example.com/blog/example_entry/ wo blog die page und example_entry die ID des eintrags repräsentiert. Bin da aber auch kein Profi, bin froh wenn meine htaccess das tut was sie soll und lasse sie dann in Ruhe ;)

So sieht meine .htaccess dann diesbezüglich aus:

PHP:
RewriteEngine on
RewriteRule ^([a-z]+)/$ index.php?a=$1 [L,NC] 
RewriteRule ^(blog)/([0-9]+)/([0-9]+)/$ index.php?a=blog&y=$2&m=$3 [L,NC] 
RewriteRule ^(blog)/([-0-9a-z]+)/$ index.php?a=blog&e=$2 [L,NC] 
RewriteRule ^(blog)/(tag)/([-0-9a-z]+)/$ index.php?a=blog&tag=$3 [L,NC] 
RewriteRule ^(blog)/(page)/([0-9]+)/$ index.php?a=blog&page=$3 [L,NC]
tag für angegebene suchwörter, page für eine bestimmte seite, die dritte zeile ist für monatsweises suchen..

Ob das alles optimal ist kann ich nicht sagen, es funktioniert aber.
 
Zuletzt bearbeitet:
QSA (query string append) flag. RewriteRule Flags - Apache HTTP Server

.htaccess

Code:
RewriteEngine On

# If a resource exists, serve it

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

# Otherwise, redirect to index file

RewriteRule ^(.*)$ index.php?page=$1 [NC,QSA,L]

index.php

PHP:
<?php

var_dump($_GET);

URL: [noparse]http://example.org/bla/test/?blub=blab&blob=bleb[/noparse]

Ausgabe:

Code:
array
  'page' => string 'bla/test/' (length=9)
  'blub' => string 'blab' (length=4)
  'blob' => string 'bleb' (length=4)
 
Werbung:
Auf meine Situation umgebaut wäre es dann
Code:
RewriteEngine on
RewriteRule ^([A-Za-z0-9]+)/?$ /index.php?page=$1 [L]
RewriteRule ^(page)/([A-Za-z0-9]+)/?$ /index.php?page=page&tab=$2 [L,NC]
richtig?
Zwar funktioniert Page so, jedoch nicht Tab.

Über QSA-Flags habe ich mich im Vorraus auch informiert, ich fürchte das ist eine Materie zum Verzweifeln. Zurzeit verstehe ich es auch am Beispiel nicht.
 
Werbung:
Ah, verstanden, das ermöglicht die virtuelle Ordnerstruktur für einen Parameter und die anderen sind normal anhängbar. :D
Das trifft es schon sehr gut, danke. Einen zweiten Parameter, Tab, da sehr häufig auftretend, würde ich gern noch in die virtuelle Ordnerstruktur übernehmen, andere treten nur gelegentlich auf und dienen nicht der Navigation und können daher normal als Get-Parameter auftreten.
Wie binde ich einen zweiten Parameter ein?

Ein Hinweis zum obigen Beispiel, mit var_dump[$_GET]; in der Index gibt es erstmal eine Ausgabe vom Array, weiterhin sind die Links nicht mehr funktionabel und das CSS wird nicht geladen. Ohne den Zusatz allerding funktioniert es fehlerfrei.
 
Code:
RewriteEngine On

# If a resource exists, serve it

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

# Otherwise, redirect to index file

RewriteRule ^([^/]+)(?:/?|/(.+?)/?)$ index.php?page=$1&tab=$2 [NC,QSA,L]

In Worten: Setze den Pfadanteil vor dem ersten Slash (falls vorhanden, sonst bist Pfadende) in den Parameter page, setze den restlichen Pfadanteil (bis auf einen möglichen Slash am Ende) in Parameter tab.

Tests:

Code:
path                    page        tab         query
------------------------------------------------------------
(root)                  -           -           -
foo                     'foo'       ''          -
foo/                    'foo'       ''          -
foo?x=y                 'foo'       ''          ['x'] => 'y'
foo/?x=y                'foo'       ''          ['x'] => 'y'
foo/bar                 'foo'       'bar'       -
foo/bar/                'foo'       'bar'       -
foo/bar/baz             'foo'       'bar/baz'   -
foo/bar/baz/            'foo'       'bar/baz'   -
foo/bar?x=y             'foo'       'bar'       ['x'] => 'y'
foo/bar/?x=y            'foo'       'bar'       ['x'] => 'y'

Zwei Probleme:

  1. Der reguläre Ausdruck ist schon recht kompliziert.
  2. Die Annahme, dass immer alles bis zum ersten Slash zu page gehört und immer alles danach zu tab, ist nicht unbedingt für jeden Bereich der Seite zutreffend.

Ein Hinweis zum obigen Beispiel, mit var_dump[$_GET]; in der Index gibt es erstmal eine Ausgabe vom Array, weiterhin sind die Links nicht mehr funktionabel und das CSS wird nicht geladen. Ohne den Zusatz allerding funktioniert es fehlerfrei.

Das müsstest du glaube ich konkreter erklären.
 
Werbung:
Ich habe nun den Wunsch den Tab in der Form nicht mehr als Get-Parameter zu haben und der Notwendigkeit eine Datei unterteilen zu können unter einen Hut gebracht, indem ich die Abfrage nicht mehr per Get nutze, sondern in die Funktion einarbeitete, die die Seiten aufruft.
Hinsichtlich des zuletzt zitierten Absatzes: Das Einfügen von var_dump[$_GET]; in die index.php zerriss das gesamte Layout, das CSS wurde nicht mehr geladen, Links waren nicht mehr nutzbar. Ohne den Schnipsel funktioniert es problemlos.

Von meiner Seite aus hier erledigt, vielen Dank für die Hilfe. :)
 
Zurück
Oben