Anker, Rewrite Engine und PHP
AllesMeins
- html
0 Sven Rautenberg0 AllesMeins0 MudGuard0 AllesMeins
Hiho,
ich nutze bei meiner Seite die Rewrite engine um die Adresse umzugestalten und lesbarere zu machen. Nun habe ich festgestellt das dann Sprungziele per Anker nicht mehr richtig funktionieren. Wenn ich einen Link in dieser Art schreibe
<A HREF="#target1">Link</A>
dann führt das nicht zum Target 1 sondern entfernt auch alle Parameter in der URL. Also wenn ich den Link auf einer Seite mit dieser adresse einbinden würde
http://www.domain.de/page/122112323/&action=hallo
dann führt der Link nicht auf
http://www.domain.de/page/122112323/&action=hallo#target1
sondern auf http://www.domain.de/page/122112323/#target1. Ist es irgendwie möglich diese Sprungziele auch trotz rewrite engine zum funktionieren zu bringen?
Grüsse
Marc
Moin!
Wenn ich einen Link in dieser Art schreibe
<A HREF="#target1">Link</A>
dann führt der Link nicht auf http://www.domain.de/page/122112323/&action=hallo#target1
sondern auf http://www.domain.de/page/122112323/#target1.
Das Anspringen von Ankern ist eigentlich ausschließlich Sache des Browsers. Der Server bekommt vom Ankerziel nichts mit, der erhält nur die URL "davor" - den Rest regelt der Browser.
Ich hab gerade mal bei EBay reingeschaut - die verwenden auch diverse Anker-Links auf die aktuelle Seite, und außerdem sehr reichlich URL-Parameter. Ich konnte feststellen, dass die die Anker-Links genau wie du anwenden, und sie funktionieren sogar!
Mit anderen Worten: Irgendwas beim Rewriting machst du wohl falsch.
- Sven Rautenberg
Hiho,
kann gut sein das ich da was falsch mache. Ok, folgendes Testszenario bei dem das Problem auftritt:
In einer Seite steht folgendes:
<A HREF="#test">LINK</A>
INHALTINHALTINHALTINHALT
<a name="test">
In der dazu gehörigen htaccess Datei steht dieses:
RewriteEngine on
RewriteRule _inhalt/([0-9,]*)/?(.*) http://localhost:100/erv/index.php?page=$1&$2
Grüsse
Marc
Hi,
Du hast hier zwei völlig unabhängige Dinge:
der fragment identifier (#bla) ist nicht Bestandteil der URL, wird auch nicht an den Server übermittelt.
Das URL-Rewriting findet rein im Server statt (solange nicht auf absolute URLs umgeschrieben wird) - davon bekommt der Browser nichts mit.
Wenn Du einen Link hast, der NUR aus einem fragment identifier besteht (<a href="#bla">), wird u.U. der Server überhaupt nicht kontaktiert.
Mit welchem Browser hast Du denn Probleme? Der IE springt manchmal Fragment Identifier erst bei einem Refresh an.
cu,
Andreas
Hiho,
ich habe gerade noch etwas rumprobiert und bin dabei auf den eigentlichen Fehler gestossen. Du hast recht es hat nichts mit der rewrite engine zu tun (bzw. nur sehr indirekt was mich zu dem Fehlschluss gebracht hat). Ich denke der Fehler ist die angabe eines <base href=''> die ich brauche damit das mit der rewrite engine zuverlässig funktioniert. Das macht das ganze aber nicht unbedingt einfacher. Irgend eine Idee wie ich das Problem in den Griff bekomme?
Grüsse
Marc
Moin!
Ich denke der Fehler ist die angabe eines <base href=''> die ich brauche damit das mit der rewrite engine zuverlässig funktioniert.
Nein, die brauchst du nicht.
<base href> setzt, abweichend von der aktuellen URL, eine andere als "Standard" für relative Links. Der Link "#target" ist ein relativer Link, er verweist auf die absolut identische Seite, plus dem angegebenen Ankerziel - jedenfalls ohne <base href>.
MIT <base href> verweist der Link auf die im href angegebene URL plus Ankerziel. Und die ist falsch, zumindest aber anders als die URL der aktuellen Seite.
Es gibt wirklich nahezu keinen Grund, <base href> einzusetzen.
- Sven Rautenberg
Hiho,
ich glaub ich hab mich falsch ausgedrückt. base href brauch ich nicht für die Anker Links. Da stören sie. Aber ich muss die base hrefs setzten wenn ich mit der rewrite endine Arbeite und sich die URL abhängig von den aktionen des Benutzers ändert. Einfachstes Beispiel ist schon nur eine SeitenID per rewrite Engine in den Pfad mit aufzunehmen und sie nicht mit ? an die Adresse zu hängen.
Also Benutzer ruft http://www.domain.de auf und bekommt domain.de/index.php angezeigt. Dann surft er weiter und ruft http://www.domain.de/pageID12345/ auf und das wird intern in domain.de/index.php?page=pageID12345 umgewandelt (oder so). Ab dem Punkt muss ich ja wohl oder übel mit base href arbeiten weil ich sonst ja keinerlei relative Verweise mehr verwenden kann (seien es nun Grafiken oder Links oder so).
Sprich ich müsste entweder meine ganze Seite auf absolute Verweise umstellen oder ich muss base href verwenden. Oder gibt es noch ne dritte Alternative?
Marc
Hi,
Sprich ich müsste entweder meine ganze Seite auf absolute Verweise umstellen oder ich muss base href verwenden. Oder gibt es noch ne dritte Alternative?
Server-relative Adressierung, sprich: immer mit / beginnen.
Kleiner Nachteil: ohne Webserver geht nichts, also auch lokal ein Apache oder ähnliches erforderlich. Andererseits sehe ich das nicht wirklich als Nachteil an ...
cu,
Andreas
Hiho,
gibt es noch irgend eine andere Möglichkeit? Weil das schliesst ja auch wieder ein die komplette Seite abzuändern (was leider ne ganze Menge Arbeit ist) bzw. ein PHP script zu schreiben das die Verweise automatisch verändert (was wiederum einschliesst das ich irgend was vergesse das nicht erkannt wird und somit wieder tote Links/Grafiken/Dateien habe).
Marc