# mod_rewrite mit variabler Struktur



## Sebigf (13. April 2006)

Hallo zusammen,

ich habe im Moment dass Problem, dass ich viele variable Werte in meinen URLs habe.
Ich hatte vor, dass ganze nut mit einem Slash "/" zu handelt.

Aber wie mache ich es am besten, dass nicht // oder sogar ///// in der URL steht, weil es keine Werte gibt ?!

Danke


----------



## Gumbo (13. April 2006)

Du müsstest jeden zusätzlichen Teil als optional auszeichnen, etwa:
	
	
	



```
RewriteRule	^([^/.]+)/(?:([^/.]+)/)?$	/foo?bar=$1&baz=$2	[L]
```
Alternativ kannst du auch für jede Möglichkeit eine eigene Regel aufstellen, etwa:
	
	
	



```
RewriteRule	^([^/.]+)/([^/.]+)/$	/foo?bar=$1&baz=$2	[L]
RewriteRule	^([^/.]+)/$		/foo?bar=$1		[L]
```


----------



## Sebigf (14. April 2006)

Danke Gumbo für die Antwort 

Es hat direkt funktioniert !

Ich habe nun nur ein Problem...

Ich habe einen css style im Ordner "./styles/style.css" abgelegt.
Dieser wird nun, anscheinend wegen der Rewrite-Rebel, nicht mehr berücksichtigt, und die Page wird "ohne" CSS wiedergegeben.

Hast du da eine Idee, um für die CSS Datei eine Ausnahme zu machen ?

Danke


----------



## Gumbo (14. April 2006)

Setze mal zusäzulich folgende Bedingungen für die Regeln ein:
	
	
	



```
RewriteCond	%{REQUEST_FILENAME}	!-d
RewriteCond	%{REQUEST_FILENAME}	!-f
```
Damit werden existente Verzeichnisse und Dateien von der Umschreibung ausgeschlossen.


----------



## Sebigf (14. April 2006)

Danke für den Code, aber es ändert sich nichts.

Hier mein gesamter Code


```
RewriteCond    %{REQUEST_FILENAME}    !-d
 RewriteCond    %{REQUEST_FILENAME}    !-f
 RewriteRule    ^([^/.]+)/(?:([^/.]+)/)?$ /index.php?site=$1&show=$2&id=$3&entry=$4&style=$5&language=$6&filter=$7&session=$8&message=$9    [L]
```


----------



## Gumbo (14. April 2006)

Aber die Rewrite Engine ist schon aktiviert?


----------



## Sebigf (14. April 2006)

Ja, natürlich 


```
## Rewrite-Engine aktiv?
 
 RewriteEngine on
```


----------



## Sebigf (14. April 2006)

Habe ich noch vergessen zu sagen...

Ich hatte


```
RewriteBase /
```

auch einmal darin. Aber auch wenn es raus ist, tut sich nichts.


----------



## Gumbo (14. April 2006)

Jede Backreference benötigt ein Subpattern:
	
	
	



```
RewriteEngine	on
RewriteCond	%{REQUEST_FILENAME}	!-d
RewriteCond	%{REQUEST_FILENAME}	!-f
RewriteRule	^([^/.]+)/(?:([^/.]+)/)?(?:([^/.]+)/)?(?:([^/.]+)/)?(?:([^/.]+)/)?(?:([^/.]+)/)?(?:([^/.]+)/)?(?:([^/.]+)/)?(?:([^/.]+)/)?$	/index.php?site=$1&show=$2&id=$3&entry=$4&style=$5&language=$6&filter=$7&session=$8&message=$9	[L]
```


----------



## Sebigf (14. April 2006)

mmh, geht leider immer noch nicht 

Kann es vielleicht am CSS Tag im Header liegen ?


```
<link title="Style" media="screen" type="text/css" href="./styles/style_4.css" rel="stylesheet"/>
```


----------



## Gumbo (14. April 2006)

Nein, daran wird es wohl nicht liegen. Du kannst du Ressource ja mal direkt aufrufen.


----------



## Sebigf (14. April 2006)

Mmh, ok. Das geht normal.

Vll. liegt es an der Art der URL.

Das ganze sieht beim Aufrufen so aus:

http://www.domain.de/wert1/wert2/

Vielleicht irgend etwas daran ?


----------



## Sebigf (14. April 2006)

Ich habe gerade etwas anderes überlegt...

Wie lautet die Regel, wenn ich die URL so aussehen lassen möchte:

http://www.domain.de/wert1/wert2/wert3.html

?

Vielleicht würde das ja das Problem beheben (?)


----------



## Sebigf (17. April 2006)

Ich habe noch ein wenig herum probiert, aber leider geht es nicht mit der CSS Datei.
Sobald ich in der URL ein "/" einbinde, wird die CSS Datei ausgeschloßen...


----------



## Dr Dau (17. April 2006)

Hallo!

Nur so eine Idee.
Könnte es evtl. sein dass Apache die CSS-Datei nun in einem falschen Verzeichnis sucht?

Der Verweis zur CSS-Datei besagt ja dass diese im Verzeichnis "styles" ausgehend vom aktuellem Verzeichnis liegt.

Um bei Deinem letztem Beispiel zu bleiben währe die URL also http://www.domain.de/wert1/wert2/styles/style_4.css.

Tatsächlich liegt sie aber wohl in http://www.domain.de/styles/style_4.css.
Demnach würde ich mal versuchen ob es klappt, wenn Du den Verweis zur CSS-Datei in href="../../styles/style_4.css" änderst.

Alternativ würde ich auch versuchen die CSS-Datei mit href="http://www.domain.de/styles/style_4.css" einzubinden, ich weiss jetzt aber nicht ob es so überhaupt erlaubt ist.

Gruss Dr Dau


----------



## Sebigf (17. April 2006)

Hallo !

Ja, es lag daran und es hat auch so funktioniert, wie du es gerade gesagt hast. 

Ich habe mich wieder auf die Komma-Lösung gestürzt, weil diese einfach "unanfälliger" scheint.

Ich habe nun nur ein Problem mit Zahlen in der URL

Aktuell sieht die ganze Rewrite-Struktur so aus:


```
RewriteEngine    on
 RewriteCond    %{REQUEST_FILENAME}    !-d
 RewriteCond    %{REQUEST_FILENAME}    !-f
 RewriteRule    ^([^/]+),(?:([^,]+))?(?:([^,]+))?(?:([^,]+))?(?:([^,]+))?(?:([^,]+))?(?:([^,]+))?(?:([^,]+))?(?:([^,]+))?(?:([^,]+))?.html$    /index.php?site=$1&show=$2&id=$3&entry=$4&style=$5&language=$6&filter=$7&session=$8&message=$9    [L]
```

Die URL, die "nicht" angezeigt werden kann sieht so aus:


```
http://www.domain.de/seite,main,1.html
```

Kann jemand sagen, woran das liegen kann ?

Danke


----------



## Gumbo (17. April 2006)

Falls du dein System unter Windows läuft, solltest du dir mithilfe des Regex Coach selbst passende Reguläre Ausdrücker zusammenschustern und nicht für jede kleine Änderung uns fragen. Alternativ kannst du auch jedes andere Hilfsmittel (etwa PHP) nutzen, das Reguläre Ausdrücke verarbeiten kann.


----------



## Sebigf (18. April 2006)

Hallo !

Ich bins dann doch noch einmal 
Ich habe mir den Regex Coach gesaugt und auch ausprobiert. Nur scheint er bei mir Buggy zu sein, da er kaum auf meine Eingaben reagiert.

Zu meinem Problem:

Ich verstehe, dass ihr nicht wegen jedem kleinen Problem eine Antwort schreiben möchtet.
Mein Problem liegt gerade bei dem Punkt, diese Syntax zu verstehen, die du mir da geschrieben hast. Ich weis, dass sie funktioniert. Nur ich würde sie gerne umändern, aber verstehe es nicht ganz.

Ist es irgendwie möglich, dass ich, wenn der wert == 0 ist, der Wert nur einfach nicht angezeigt wird in der URL aber trotzdem übergeben wird als 0 ?

Das ist das einzige Problem, was mich im Moment noch quält. 
Eine kleine Erklärung deines Codes währe wirklich super von dir 

Danke !


----------



## Dr Dau (18. April 2006)

Ich kenne mich selbst nicht mit regulären Ausdrücken und/oder mod_rewrite aus, daher kann ich Dir dabei leider auch nicht helfen.

Ich habe mir den Regex Coach auch mal angesehen, komme damit aber genauso wenig klar wie Du.
Mir scheint so, dass man dafür auch die Syntax erstmal verstehen muss.

Da die ganze Sache für mich aber auch nur "just for fun" ist (es als Hobby bzw. Freizeitvergnügen zu bezeichnen, währe schon stark übertrieben) habe ich mich auch nie mit regulären Ausdrücken befasst.
Evtl. hilft Dir ja die PHP-Funktionsreferenz für reguläre Ausdrücke weiter, nur leider ist die Syntaxbeschreibung nicht auf deutsch verfügbar.


----------



## Sebigf (20. April 2006)

Ich sitze noch immer an einem Weg für meine Lösung 
Ich habe es mittlerweile auf das Komma gelegt, weil das soweit benutzerfreundlicher erscheint.

Hier der aktuelle Stand.


```
RewriteRule    ^([^,.]+),(?:([^,.]+),)?(?:([^,.]+),)?(?:([^,.]+),)?(?:([^,.]+),)?(?:([^,.]+),)?(?:([^,.]+),)?(?:([^,.]+),)?(?:([^,.]+))?.html$    /index.php?site=$1&show=$2&id=$3&entry=$4language=$5&filter=$4&session=$7&message=$8    [L]
```

Mein Problem ist es, dass die Positionen der Werte irgendwie nicht immer stimmen.


```
Beispiel: http://www.domain.de/seite/news.html

print_r() sagt dazu: Array (     [site] => seite     [show] =>      [id] => news [entry] => language=     [filter] =>      [session] =>      [message] =>  )
```





```
Beispiel 2: http://www.domain.de/seite/news/145.html
Hier ist eine NewsID angehangen, und es funktioniert.

print_r() sagt dazu: Array (     [site] => seite     [show] => news     [id] => 145     [entry] => language=     [filter] =>      [session] =>      [message] =>  )
```


Irgendwie scheint das ganze übersprungen zu werden, obwohl keine Werte gesetzt wurden ! Bei dem 1. Beispiel ohne ID muss eine Übersichtsseite angezeigt werden. Bei dem mit der ID, die entsprechende KategorieID.

Danke


----------



## Sebigf (27. April 2006)

Sooo, ich habe nun lange an den Sachen experimentiert...

Ich habe mich gefragt, ob es möglich währe, dass man von rechts nach links Prüfungen einbauen kann, die den Wert prüfen.


Beispiel:


```
RewriteCond %{REQUEST_URI} ^/(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*).html
RewriteRule ^(.*) /index.php?site=%1&show=%2&id=%3&entry=%4&language=%5&filter=%6&session=%7&message=%8
```

Nun würde ich gerne bei %8 beginnen eine Prüfung durchzuführen... Sodass URLs von folgender Struktur möglich sind:

http://www.domain.de/muh,test.html
http://www.domain.de/muh.html
http://www.domain.de/muh,0,132.html

Es soll dann einfach so sein, dass bei einem lehren Wert einfach die 0 angehangen wird. Aber das regel ich mit php.


Die Idee:

Es sollen unnötige 0 aus der URl verschwinden. Da meistens die letzten 3 Werte zu 95% immer 0 sein werden, fände ich so eine Lösung nicht übel.

Zumal ich gehört habe, dass durch zu viele 0en die Suchmaschinen-Bots gehindert werden...


Danke


----------



## Gumbo (27. April 2006)

Wie bereits erwähnt, muss du die einzelnen Teile als optional deklarieren:
	
	
	



```
RewriteRule   ^([^,]+)(?:,([^,]+))?(?:,([^,]+))?(?:,([^,]+))?(?:,([^,]+))?(?:,([^,]+))?(?:,([^,]+))?(?:,([^,]+))?\.html$   /index.php?site=$1&show=$2&id=$3&entry=$4&language=$5&filter=$6&session=$7&message=$8   [L]
```
Oder du zerlegst es in alle möglichen Varianten:
	
	
	



```
RewriteRule   ^([^,]+)\.html$   /index.php?site=$1   [L]
RewriteRule   ^([^,]+),([^,]+)\.html$   /index.php?site=$1&show=$2   [L]
…
RewriteRule   ^([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+)\.html$   /index.php?site=$1&show=$2&id=$3&entry=$4&language=$5&filter=$6&session=$7&message=$8   [L]
```


----------

