Hallo Nico R.,
was Du da hast, ist eine URL-Route. Die muss vom Apache abgefangen werden. In einfachen Fällen reicht mod_rewrite-Logik, in schwereren Fällen liest Du die Route aus $_SERVER['REQUEST_URI'] und verwendest einen PHP-Router, um sie zu interpretieren und ggf. auch gleich aus dem ersten Teil der Route eine passende Controller-Klasse zu erzeugen (aber NIE NIE NIE ungeprüft, ob das ein gültiger Controllername ist).
Wie auch immer, der Browser bekommt den Rewrite nicht mit und löst relative Adressen in Bezug zur Routen-URL auf. Wenn Du variabel lange Routen hast, wie bei Dir mit produkte und produkte/produkt1, ist eine Adressierung von Ressourcen relativ zur URL nicht mehr handhabbar[1].
Lösung 3 ist für die Lösung "absolute URLs" die richtige.
$base = dirname($_SERVER['SCRIPT_NAME']) liefert Dir in der index.php das logische Root deines Webauftritts und wenn Du dieses logische Root mit Ressourcenpfaden verkettest, die relativ dazu sind, bist Du auf der sicheren Seite. Auch dann, wenn die URL auf dem produktiven Server den Pfadteil /projekt nicht mehr enthält.
Du kannst aber auch Lösung 1 anstreben, <base href> auf den $base Wert setzen, und dann im HTML alle Ressourcen relativ dazu abrufen. Das würde ich dann aber explizit machen. Also "./css/style.css" und nicht "css/style.css".
Denke dabei auch immer daran, dass der Rewrite vielleicht gar nicht stattfindet. Vielleicht rufst Du index.php auch mal direkt auf. Ob das geschieht, kannst Du an $_SERVER['REDIRECT_URL'] erkennen. Beim Direktaufruf fehlt der Wert.
Beides geht. Lösung 1 braucht keine PHP-Action bei jeder Ressourcenreferenz, aber gerade das könnte zu Unaufmerksamkeit führen. Lösung 3 braucht kein <base>, aber dafür eben explizites Ausgeben von $base bei jedem Ressourcenzugriff.
Von Lösung 2 würde ich abraten, weil sie nur funktioniert, wenn die absoluten Pfade auf Dev- und Prod-Servern identisch sind.
Bei Ressourcen mit relativem Pfad, die aus CSS-Dateien heraus geholt werden, denke daran, dass die nicht relativ zum HTML Dokument oder zum base-href sind, sondern relativ zur CSS Datei in der sie stehen.
Rolf
sumpsi - posui - obstruxi
ich sage bewusst handhabbar, denn MACHBAR ist das schon. Wenn man das Rewrite-Plugin für den Microsoft IIS benutzt, dann flöht es tatsächlich jede Web-Response auf relative URLs und passt sie an, damit man im index.php relative URLs so verwenden kann, als ob man index.php direkt aufgerufen hätte ↩︎