mod_rewrite - Zugrifff auf ursprünglichen Pfad nicht zulassen

glowhand

Programmierer
21 April 2006
273
16
Hallo!
Ich habe eine Kleine .htaccess-Datei erstellt mit folgendem Inhalt:

Code:
RewriteEngine on

RewriteRule ^([0-9]+)$ index.php?c=pub&p=home&id=$1
RewriteRule ^([0-9]+)(\-)(.+)$ index.php?c=pub&p=home&id=$1&$3=1
RewriteRule ^(.+?)(-)([a-z]+)(\.html)$ index.php?c=$1&p=$
RewriteRule ^([a-z]+)(\.html)$ index.php?c=pub&p=$1

Ich hoffe, weitere Erklärungen dazu kann ich mir sparen, funktioniert auch soweit es soll...
Ich möchte nun aber, dass ein Besucher nicht mehr die Möglichkeit hat, die index.php direkt aufzurufen, dh. www. meine - seite .de / index.php?c=abc&p=def soll nicht funktionieren (bzw. er soll automatisch auf die Startseite leiten).
Bzw., noch allgemeiner: Wenn ein Aufruf nicht auf einen der regulären Ausdrücke passt (außer er führt ins /public-Verzeichnis, in der Bilder, Stylesheets und Scripts liegen) soll auf die Startseite geleitet werden.

Ich komme einfach nicht dahinter ;)
Hoffe, jemand weiß Rat.
 
Bau mal in deine index.php ein phpinfo() rein, irgendwo müsste sich da afair ein Hinweis auf den Rewrite finden.
Falls nicht, kannst du in der RewriteRule mit dem E-Flag eine Umgebungsvariable setzen und im PHP-Script deren Vorhandensein überprüfen. Siehe Apache-Manual :rtfm:

OK, wie immer wenn man schon einen kompletten Post getippt hat, kommt am Schluss der funkende Gedanke: In $_SERVER['REQUEST_URI'] müsste die vom Client angeforderte Adresse stehen...wenn die mit "index.php" beginnt, war's also ein Direktaufruf.
 
In $_SERVER['REQUEST_URI'] müsste die vom Client angeforderte Adresse stehen...wenn die mit "index.php" beginnt, war's also ein Direktaufruf.
Richtig. Und wenn dem so ist, musst du dem Client dann eine ordentliche Fehlermeldung, d.h.
PHP:
header($_SERVER['HTTP_PROTOCOL']. " 404 Not Found");
oder wesentlich besser ne 301-Antwort liefern, damit Suchmaschinen die alte URL als erledigt abhaken und dann die neue "rewritete" URLs benutzen.
 
Müssen/Sollten die Response-Header immer dieselbe HTTP-Version nutzen wie die Anfrage? Bisher hab ich einfach immer HTTP/1.0 mitgesendet, spricht da was dagegen?
 
Gute Frage. Besser solltest du das tun.

RFC 1945 (definiert HTTP 0.9 und HTTP 1.0) sagt
HTTP/1.0 servers must:

o recognize the format of the Request-Line for HTTP/0.9 and
HTTP/1.0 requests;

o understand any valid request in the format of HTTP/0.9 or
HTTP/1.0;

o respond appropriately with a message in the same protocol
version used by the client.
RFC 2068 (HTTP 1.1) hierzu:
Applications sending Request or Response messages, as defined by this
specification, MUST include an HTTP-Version of "HTTP/1.1". Use of
this version number indicates that the sending application is at
least conditionally compliant with this specification.

The HTTP version of an application is the highest HTTP version for
which the application is at least conditionally compliant.

Proxy and gateway applications must be careful when forwarding
messages in protocol versions different from that of the application.
Since the protocol version indicates the protocol capability of the
sender, a proxy/gateway MUST never send a message with a version
indicator which is greater than its actual version; if a higher
version request is received, the proxy/gateway MUST either downgrade
the request version, respond with an error, or switch to tunnel
behavior. Requests with a version lower than that of the
proxy/gateway's version MAY be upgraded before being forwarded; the
proxy/gateway's response to that request MUST be in the same major
version as the request.

Note: Converting between versions of HTTP may involve modification
of header fields required or forbidden by the versions involved.
Du musst halt immer damit rechnen (ok, seeeeehr unwahrscheinlich), dass ein Client anfragt, der eine niedrigere Version hat und dann deine Antwort nicht versteht.

Am sichersten is immer, du antwortest in der Version, in der du gefragt worden bist.
Normalerweise würdest du einen Protokoll-Wechsel (das ist das ja) mit HTTP 101 durchführen, aber dieses Feature ist auch erst Bestandteil von HTTP 1.1. Ne, viel zu viel Aufwand, antworte einfach mit der passenden Version, dann is alles gut.
 
Zuletzt bearbeitet:
So, danke erstmal... ich habe das jetzt mit einer Mischung aus mod_rewrite, ErrorDocument und PHP gelöst.

Nochmal eine Frage an dich theHacker... Du meinst, wenn die Seite nicht gefunden wurde, soll eine für Suchmaschinen leicht lesbare Fehlermeldung erscheinen. Ich möchte aber die Fehlermeldung in dem Design meiner Seite integriert (sieht einfach besser aus und verschreckt Besucher, die auf eine nicht mehr existente Seite zugreifen möchten nicht)... Wie lässt sich das am besten miteinander vereinen?
Und wäre es nicht eigentlich sogar zu meinem Vorteil, wenn die Suchmaschine nicht erkennt, dass es sich um eine Fehlerseite handelt und sie damit zusätzlich indiziert?
 
Nochmal eine Frage an dich theHacker... Du meinst, wenn die Seite nicht gefunden wurde, soll eine für Suchmaschinen leicht lesbare Fehlermeldung erscheinen.
Ich meine, du sollst dich ans Protokoll halten. Sendest du 404 (wirst du über ErrorDocument wohl gemacht haben), verlierst du u.U. deinen Indexeintrag in der Suchmaschine.

Sag halt, was los is: Die Seite gibt es unter der angeforderten URL nicht mehr, aber sie ist ab sofort dauerhaft unter ..... zu erreichen. Halte dich einfach ans Protokoll und sende 301.
Ich möchte aber die Fehlermeldung in dem Design meiner Seite integriert (sieht einfach besser aus und verschreckt Besucher, die auf eine nicht mehr existente Seite zugreifen möchten nicht)... Wie lässt sich das am besten miteinander vereinen?
Vereinen lässt sich das, in dem du das "short" (RFC 1945, 9.3, 301 Moved Permanently) ein bisschen weiterfasst und eben das komplette Layout sendest.

Ich mache das genauso, um meine Relikte aus theHacker.ws v2 noch immer mitzuschleifen, wer noch einen alten Link hat.

Beispiel: https://www.thehacker.ws/sitemap.php

  • Was siehst du, wenn du diesen Link klickst? (Antwort: der Browser zeigt die Seite nicht mal, weil automatisch weitergeleitet wird)
  • Was siehst du, wenn du die URL von Hand aufrufst? (Antwort: eine 301-Response, die trotzdem das komplette Layout hat, sollte ein Useragent mal nicht automatisch umleiten; außerdem wissen somit alle Crawler Bescheid, da sie über den Location-Header mit der neuen URL versorgt werden)
 
Bzw., noch allgemeiner: Wenn ein Aufruf nicht auf einen der regulären Ausdrücke passt (außer er führt ins /public-Verzeichnis, in der Bilder, Stylesheets und Scripts liegen) soll auf die Startseite geleitet werden.

wäre es nicht sinnvoller, wenn jemand die index.php-Seiten aufruft, dass er dann mit nem 301 Moved Permanently auf die Domain mit mod_rewrite geleitet wird.
Denn somit würde jede Suma ganz schnell auch die Seiten im Index aktualisieren, denn ne Nachfrage, ob die Seite noch genauso existiert macht der Google Crawler deutlich öfter als nen wirklichen Besuch, wo er sich dann alle Links ansieht.
Und nebenbei funktionieren auch die alten Bookmarks noch ;)