# mod_rewrite und relative Pfade



## myvox (15. Dezember 2006)

Hallo,
ich nutze seit kurzem mod_rewrite um meine lange URLs der Übersichtlichkeit halber auszublenden. So transformiere ich z.B. URLs in der Art 
	
	
	



```
http://localhost/abc/index.php?module=publications&action=readmore&articleID=17
```
zu 

```
http://localhost/abc/artikel/17
```
. Das geschieht so:

```
RewriteCond %{REQUEST_URI} artikel/([0-9]+)$
RewriteRule artikel/?([0-9]+)$ index.php?module=publications&action=readmore&articleID=$1
```
Das Problem liegt nun darin dass ich CSS-Stile und Templates benutze, die einen relativen Pfad suchen. So habe ich vom Hauptverzeichnis aus 2 Ordner namens tpl (Templates) und css (Stile). Wenn ich nun die kurzen URLs aufrufe, werden die Stile und templates nicht richtig geladen, weil die Pfadangaben nicht mehr richtig sind (Verweis für CSS-Datei ist jetzt z.B. nicht mehr "./css" sondern "./artikel/css" weil meine Templates/Stile sich den kompletten Pfad aus der URL herziehen.
Da ich aber darauf angewiesen bin, KEINE absoluten Pfade zu benutzen. Gibt es eine Möglichkeit dies in der htaccess zu unterbinden, also die alten Pfadangaben in den Dateien weiterzugeben oder müsste ich dazu einen absoluten Pfad z.b. in Sessions zwischenspeichern? Ich will gar nicht daran denken was passiert wenn ich Links à la abc/artikel/1/2/3 nutzen würde...


----------



## Gumbo (15. Dezember 2006)

Du hast zwei Möglichkeiten: entweder du nimmst absolute Pfadangaben oder schreibst die Anfragen der Template- und CSS-Dateien ebenfalls um. Ich empfehle dir jedoch ersteres.


----------



## myvox (15. Dezember 2006)

Hm, das wollte ich tunlichst vermeiden, aber da es wohl keine andere Möglichkeit gibt, muss ich die zugunsten der kurzen Adresse hinnehmen. Ich danke Dir!


----------



## shutdown (27. März 2008)

Auch wenn ich damit ein etwas älteres Thema wieder aufleben lasse - es passt denke ich ganz gut dazu, da ich im Grunde das gleiche Problem habe.

Folgende OrdnerStruktur

```
+root
|-...
|-...
|-+unter
|-|-+templates
|-|-|-+template1
|-|-|-|-+css
|-|-|-|-+images
```

Jetzt, was ich eigentlich mache:
Per htaccess leite ich alle Anfragen auf den Ordner /templates auf /unter/templates weiter:


```
RewriteRule templates/(.*) unter/templates/$1
```

Jetzt habe ich genau obiges Problem, dass ich im Ordner css css-Dateien liegen habe, die relativ auf images verweisen 


```
background-image: url(../images/bild.png)
```

Wie kann ich nun diese URL per htaccess umbiegen?
Dadurch, dass ich ja alle Anfragen auf templates umleite, müssten doch auch alle Anfragen auf die Unterordner entsprechend umgebogen werden - oder?

Oder müsste ich das anders machen?

@Gumbo: Warum rätst du grundsätzlich von dieser Vorgehensvariante ab?
Handle ich mir da Ärger ein, den ich derzeit übersehe?

Vielen Dank schonmal
shutdown


----------



## Gumbo (27. März 2008)

Die zweitgenannte Möglichkeit, dass einfach die Anfragen umgeschrieben werden, führt zu dem Problem, dass ein und dieselbe Ressource unter vielen URLs erreichbar ist. Existiert beispielsweise eine „/foo/bar.html“ und eine „/baz.html“, die beide durch relative Pfade eine „styles.css“ anfordern, wird diese jeweils zu „/foo/styles.css“ und „/styles.css“ aufgelöst. Und obwohl der Inhalt identisch ist, da auch die Ressource identisch ist, sind die URLs unterschiedlich. Das verhindert beispielsweise effizientes Caching, da „/foo/styles.css“ vom Client als eine andere Ressource als „/styles.css“ betrachtet wird.


----------



## shutdown (27. März 2008)

Okay, das ist verständlich.

Dieses Problem dürfte sich in meinem Fall allerdings denke ich nicht ergeben, da alles über die index.php eingebunden wird (CMS) und alle Unterordner eigentlich abgeschlossen arbeiten.

Von daher müsste der Pfad eigentlich immer der gleiche sein.

Allerdings warum übersteuert meine RewriteRule nicht die relativen Aufrufe?


----------

