Clanintern Clanintern Clanintern

Forum

Öffentliche Foren
FORUM: Spiele & Computer THEMA: Kleine HTACCESS Frage
AUTOR BEITRAG
Whiteknight KKK

RANG Deckschrubber

#1 - 04.07 18:14

Hey Leute, eine kleine Frage.

Wenn ich bsp. eine Seite aufrufe die es nicht gibt, leite ich mit htaccess auf eine Fehlerseite um. Und zwar so:

ErrorDocument 404 http://www.meineseite.de/404.php


Nun würde ich aber gerne noch an die 404.php die Parameter von der letzten Seite übergeben. Habe ich also zuletzt

http://www.meineseite.de/gibtsnicht aufgerufen, möchte ich das weiterleiten, also in etwa so:

ErrorDocument 404 http://www.meineseite.de/404.php?letzteseite=gibtsnicht

Geht soetwas?
*al!ve* - irgendwo zwischen Semester 4 und 7

RANG 0wn3r

#2 - 05.07 19:12

Ich würde das eher mit mod_rewrite lösen. Dabei bleibt dann auch die Möglichkeit der Unterscheidung, wo die angefragte Datei liegen soll und welchen Typ sie haben soll.


.htaccess:
[code]
RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule ^(.*)$ $1 [L]

RewriteRule ^(.*)$ rewrite_log.php [L]

RewriteRule ^(.*)\.gif$ rewrite_gif.php [L]
RewriteRule ^(.*)\.jpg$ rewrite_jpg.php [L]
RewriteRule ^(.*)\.png$ rewrite_png.php [L]

RewriteRule ^(.*)$ rewrite_html.php
[/code]

rewrite_html.php:

<?PHP


echo 'Angefragte Datei: '.$_SERVER['REQUEST_URI'].'<hr>';
phpinfo();

?>


rewrite_image.php:

<?PHP


$img
=imagecreatetruecolor(30040);
$text_color=imagecolorallocate($img200200200);
imagestring($img255,  'Die Datei existiert nicht:'$text_color);
imagestring($img2518,  $_SERVER['REQUEST_URI'], $text_color);

?>


rewrite_png.php:

<?PHP


include('rewrite_image.php');
header('Content-Type: image/png');
imagepng($img);

?>


rewrite_log.php:

<?PHP


// Hier nach Belieben Logging einbauen.
$fp fopen('404.txt''a+');
fputs($fp$_SERVER['REQUEST_URI']."n");
fclose($fp);

?>


Die Dateien für rewrite_jpg und rewrite_gif analog zur rewrite_png, nur andere Header-Information und imagegif bzw. imagejpeg statt impagepng.


In alle Dateien könnte man jetzt nen 404er Header einbauen und nach Bedarf loggen. Wobei loggen hier eher unnötig ist, das tut der Webserver ja schon von Haus aus, würde ich sagen.


Nachdem bei Bildern nicht so wichtig ist welches Bild nun genau nicht gefunden wurde, könnte man hier statt einer PHP-Datei statisch ein Bild hinterlegen und dadurch sparen, bei jedem ungültigen Bildaurfruf das Bild dynamisch zu generieren.


[edit]


Scheiß Codeformatierung hier.
Whiteknight KKK

RANG Deckschrubber

#3 - 05.07 21:24

ach Du scheiße, so kompliziert? Vielen Dank erstmal für soviel Mühe! Ich kenne mich mit htaccess aber leider nicht gut aus und ich bin mir nicht sicher ob's das trifft was ich vorhabe.

Was ich eigentlich möchte:

1) Wenn eine Seite / Datei nicht gefunden wurde, weiterleiten auf eine Fehlerseite (klappt ja schon).

2.) Ich würd aber jetzt gerne (und das ist neu), wie bsp. bei Myspace, dass man seine Profilseite über http://www.meineseite.de/meinprofil erreicht. Also sowas wie
http://www.meineseite.de/Stefan
oder
http://www.meineseite.de/Klaus

Natürlich gibt es die Seite "Stefan" oder "Klaus" nicht und so leitet meine htaccess auf die Fehlerseite um. Dort kann ich aber die Information "Stefan" oder "Klaus" nicht verwendet um den User ggf. auf seine Profilseite weiterzuleiten. Ich kann aber auch nicht für jedes Profil Regeln erstellen oder Verzeichnisse dafür anlegen.

Klar was ich vor habe?

Hoffe jemand hat eine recht simple Idee *g*.
*al!ve* - irgendwo zwischen Semester 4 und 7

RANG 0wn3r

#4 - 06.07 00:14

Dann hab ich ja genau den richtigen Punkt getroffen.

.htaccess:
RewriteEngine On
RewriteRule ^profil/(.*) profil.php
code

^^ Das ruft für alle http://deineDomain/verzeichnis/profil/foobar die profil.php auf. Da kannst du dann aus $_SERVER['PATH_INFO'] die Infos auslesen die du haben möchtest.
Whiteknight KKK

RANG Deckschrubber

#5 - 06.07 07:59

Ahhh cool danke *g* Glaube es klappt jetzt )

Doch so einfach ^^
*al!ve* - irgendwo zwischen Semester 4 und 7

RANG 0wn3r

#6 - 06.07 16:03

Naja, man muss halt das Prinzip hinter mod_rewrite verehen. Wenn das mal durch ist sind lange Listings auch keine größere Herausforderung als kurze.

"RewriteEngine On" schaltet grundsätzlich mod_rewrite an.

"RewriteRule A B C" ist eine Regel, wobei
* A ein regulärer Ausdruck ist der auf die Eingabe-URL passen muss,
* B die Zieldatei die statt der ursprünglichen angesprochen wird
* C eine Liste zusätzlicher Flags

A wäre eben z.B. "^(.*)$" als der Ausdruck, der beliebige zeichenkätten enthält (also alles), oder "^profil/(.*)" als der Ausdruck, der mit "profil/" anfängt.

C ist in eckigen Klammern eine kommagetrennte Liste an Zusatzoptionen. Hier häufig nur [L], was bedeutet "Wenn diese Regel zutrifft keine weitere Regel mehr prüfen/anwenden".

Eine "RewriteCondition" ist eine zusätzliche Anforderung an die nachfolgende RewriteRule, wobei man in der RewriteCondition auch Servervariablen (wie in #2 die %{SCRIPT_FILENAME}) prüfen kann. Hier kann man auch Flags anhängen, wobei die nicht mit denen der RewriteRule überein stimmen und auch nich tin eckige Klammern geschrieben werden. Das "-f" der Condition aus #2 bedeutet "der so erzeugte String muss eine gültige Datei sein (file)".
Whiteknight KKK

RANG Deckschrubber

#7 - 07.07 11:21

super Erklärung danke Habs auch erfolgreich implementieren können.
Whiteknight KKK

RANG Deckschrubber

#8 - 10.07 09:13

Vielleicht noch ne Mini-Frage:

Ich hab 2 Domains, .de und .com. Meine Seite kann man also über 4 verschiedene Varianten aufrufen:

www.meineseite.de
www.meineseite.com
meineseite.de
meineseite.com

wäre vielleicht besser alles auf www.meineseite.de zu leiten? Wäre das ein Vorteil oder eigentlich piep egal?

Ich hab das nur gerade mit der RewriteRule nicht hinbekommen.

Beispiele:
RewriteRule ^http://www.meineseite.com(.*)$ http://www.meineseite.de/$1

Hatte auch was bei Google gefunden bezüglich www voran stellen, hatte nur auch nicht funktioniert *g*

was mach ich falsch?
fishbone

RANG Deckschrubber

#9 - 11.07 05:00

Eventuell hilft dir dabei http://www.modrewrite.de/
*al!ve* - irgendwo zwischen Semester 4 und 7

RANG 0wn3r

#10 - 13.07 21:48

Mir fällt spontan nichts ein wie du an die Domain kommen könntest. Mod_rewrite geht "ab Werk" jedenfalls nur auf den Pfad.

Grundsätzlich ist es aber keine gute Idee, eine einzige Webseite unter verschiedenen Domains und Subdomains anzubieten. Wenn es sich hierbei um einmal mit und einmal ohne www handelt ist das "nur bedingt tragisch", .de und .com dagegen ist schon härter. Google nennt sowas "Duplicate Content". Sowas gibt Strafpunkte, ein schlechteres Ranking in der Googlesuche.

Mein Tip: Zwei unterschiedliche Vhosts.
Vhost1: Haupt-Vhost mit Seiteninhalt.
Vhost2: Ein PHP-Script (mod_rewrite auf dieses eine Script leiten lassen!) das mittels PHP-Funktion "header()" einen Location-Redirect in Verbindung mit einem HTTP-Status-Code "301" (moved permanently) oder "307" (temporary redirect) absetzt. Dadurch wird jede eingehende Verbindung auf einer "falschen" Domain auf die Hauptdomain umgeleitet, der Besucher befindet sich gleich auf der richtigen Seite und Google wird ordnungsgemäß darüber informiert, dass sich der Inhalt auf einer anderen Seite befindet.
Dadurch umgeht man soweit möglich Strafpunkte, behält aber trotzdem alle Domains.

Konfiguration für Vhost2:
.htaccess:
RewriteEngine On
RewriteRule ^(.*)$ redirect.php
code

redirect.php:



<?PHP
$domain 
'h t t p : //domain.zum.vhost1';
$target =  $domain.$_SERVER['REQUEST_URI'];
header('Location: '.$targetTRUE307);
?>
*al!ve* - irgendwo zwischen Semester 4 und 7

RANG 0wn3r

#11 - 13.07 22:14

RewriteEngine On

RewriteCond %{HTTP_HOST} ^das\.ist\.die\.richtige\.domain$
RewriteRule ^(.*) $1 [L]

RewriteRule ^(.*)$ redirect.php
code


^^ Mit dieser Condition werden alle Anfragen die an die richtige Domain gehen direkt ausgeführt, alle Anfragen die das nicht tun dann an die "redirect.php" weitergeleitet. Und die ist dann so aufgebaut wie in #10 beschrieben.

So brauchst du nicht mal unterschiedliche Vhosts, es reicht, wenn alle Domains auf denselben Vhost zeigen.

Es geht auch *irgend wie* nur mit mod_rewrite weil die RewriteRule auch den Location-Redirect unterstützt. Dazu bin ich aber grade *viel* zu faul .
Whiteknight KKK

RANG Deckschrubber

#12 - 07.08 08:23

vielen Dank ich probier es mal aus.
Whiteknight KKK

RANG Deckschrubber

#13 - 07.08 09:18

es funktioniert teilweise.

RewriteCond %{HTTP_HOST} ^(.*)meineurl.de(.*)$
RewriteRule ^(.*) $1 [L]
RewriteRule ^(.*)$ redirect.php
code


wenn ich jetzt .com aufrufe geht er in die redirect.php, ersetzt .com durch .de und ruft dann .de auf. Klappt bestens.

Aber ich hab noch andere Bedingungen in der htaccess, die jetzt nicht mehr funktionieren bzw. einen 500 internel server error hervorrufen.

Bsp. wenn man meineurl.de/dasbinich eingibt, dass er dann meineurl.de/index.php?user=dasbinich aufruft

RewriteRule ^user/(.*)$ index.php?user=$1
code


Wieso führt das jetzt zu einem Fehler?



Edit: Egal, ich prüf jetzt in meiner index.php (die eh immer aufgerufen wird) ob $_SERVER["SERVER_NAME"] = .com ist, wenn ja ersetzt ich es durch .de und leite es um. Also eine Lösung ohne htaccess.

In wie weit ist denn die 307 bei der Weiterleitung für die Suchmaschinen wichtig?
Crush (NSFW)

RANG Deckschrubber

#14 - 11.08 12:30

Die Message die der Statuscodes 301 (Moved Permanently) vermitteln SOLLTE ist "vergiss die alte URL, dies ist die Neue" wogegen 307 (Temporary Redirect) bedeutet "Die URL ist zur Zeit grade ne andere, aber demnächst ist sie wieder gültig". Der richtige Statuscode wäre in deinem Fall also 301, da die .com Adresse ja nur ein Alias für die .de Adresse ist, und sich dies in absehbarer Zeit wohl nicht ändern wird.

Zum Thema Statuscodes und Google:

Nach RFC ist eine Suchmaschine wenn sie einen 301 Redirect in ihrer Datenbank findet angehalten die alte URL aus der Datenbank zu löschen und durch die Neue zu ersetzen, bei einem 307 Redirect dagegen die alte URL weiterhin drin zu lassen. In wieweit Google sich an diese Vorgabe hält und was Google lieber hat, kann ich dir aber nicht sagen.
Whiteknight KKK

RANG Deckschrubber

#15 - 12.08 14:43

Ah super, danke für die Info

Bei "normalen" Weiterleitungen braucht man aber nichts angeben, oder? Also bsp. wenn man je nach Sprache zu deutsch.php oder englisch.php weiterleiten würde oder soetwas?!
Crush (NSFW)

RANG Deckschrubber

#16 - 12.08 22:09

Jede URL Weiterleitung muss alleine aus technischen Gründen einen 3xx Code senden (ausser du machst es mit Javascript, dann sieht es auf Protokollebene wie ein normaler Linkklick aus). Wenn dein Framework nicht von dir verlangt einen anzugeben, dann wird es den Code benutzen den es für richtig hält. In diesem Fall würde ich 307 verwenden, da Google ja sicherlich die Leute nach www.example.com und nicht nach www.example.com/english.php (oder wasimmer du dem Googlebot aufgrund seines Accept-Language Headers gibst) schicken soll.

Davon abgesehen würde ich die Lokalisierung lieber in das Content Management System einbauen anstatt eine andere PHP Datei für jede Sprache zu machen (Trennung von Funktionalität und Inhalten).

Also anstatt english.php und deutsch.php lieber site.php?lang=en und site.php?lang=de
Whiteknight KKK

RANG Deckschrubber

#17 - 13.08 08:45

Das mit englisch und deutsch war nur ein Beispiel, weil mir nix besseres einviel.

Ich benutze diese header Weiterleitung meistens im Fehlerfall.

Bsp. wird auf eine Fehlerseite weitergeleitet, wenn der Benutzer keine Berechtigung für den jeweiligen Bereich hat. Dann wäre ein Code wie 'moved permanently' oder 'temporary redirect' doch falsch?!

Was wäre denn dafür der richtige Code?
Crush (NSFW)

RANG Deckschrubber

#18 - 13.08 14:53

Das RFC-Konforme Verhalten wäre den entsprechenden Fehlercode zu schicken (In diesem Fall würde sich 403 forbidden anbieten) gefolgt von dem Inhalt der Fehlerseite als wäre es die Seite die der User angefordert hat. Die URL des Fehlerdokuments sollte dem Client nicht mitgeteilt werden.

Eine 3xx Weiterleitung auf eine Fehlerseite bezeichnet man als "soft 404" bzw. in deinem Fall "soft 403". Hier die (sehr negative) Meinung von Google dazu:
http://googlewebmastercentral.blogspot.com/2008/08/farewell-to-soft-404s.html
Crush (NSFW)

RANG Deckschrubber

#19 - 13.08 20:37

Kleine Allegorie.

Stell dir vor du bist die Sekretärin von Herrn Maier. Herr Maier will zur Zeit nur mit Leuten sprechen die einen Termin haben. Ein Mann kommt herein und sagt: "Hallo, ich bin Herr Googlebot, ich würde gerne den Herrn Maier kennen lernen". Jetzt gibt es verschiedene Möglichkeiten den Herrn abzuwimmeln:


403 forbidden:
"Tut mir Leid, aber Herr Maier empfängt nur auf Einladung."

200 OK:
*Auf die leere Zimmerecke deuten* "Hier ist doch Herr Maier! Er steht direkt vor Ihnen!"

301 Moved Permanently:
"Herr Maier arbeitet nicht mehr hier, sein Büro ist jetzt Zimmer 123". (Zimmer 123 ist eine Besenkammer in der ein Zettel klebt mit der Aufschrift "Haha, verarscht!" )

307 Temporary Redirect:
"Herr Maier ist grade nicht da, aber er wollte grade zu Zimmer 123 gehen". (Besenkammer)

400 Bad Request:
"Häh? Reden Sie mal so dass man sie versteht!"

404 not found:
"Herr Maier? Ich kenne keinen Herrn Maier."

500 Internal Server Error:
"Ooooh! Mein Kopf! Diese schrecklichen Kopfschmerzen! Lassen Sie mich in Ruhe!"



Erschreckenderweise muss der Herr Googlebot sich jeden Tag mit solch "hilfreichen" Sekretärinnen rumschlagen.
Whiteknight KKK

RANG Deckschrubber

#20 - 14.08 10:18

lol geile Anekdote.

Ich denke eine gewöhnliche Weiterleitung (nicht unbedingt zu einer Fehlerseite) wäre dann mit dem Code 200 richtig. Was ist denn wenn ich gar keinen Code mitgebe? Also nur ein


<?php header("Location ...blub.php"); ?>



Bei 301 verstehe ich das mit dem "verarscht" nicht. Google sollte doch dann auf die richtige Seite weitergeleitet werden, also ihn in der Besenkammer finden *g*.
Crush (NSFW)

RANG Deckschrubber

#21 - 15.08 10:33

Der Vergleich war jetzt speziell auf eine Fehlerseite bezogen. Wenn Google eine Seite aufruft und eine Fehlerseite kriegt die kein 4xx Code hat, dann geht Google davon aus, dass die Fehlerseite "ernstgemeinter" Content ist. Willst du also dein Pageranking für den Satz "Du hast keine Berechtigung für diesen Bereich" verbessern, dann leite auf deine Fehlerseiten ruhig mit 3xx weiter.

Eine Weiterleitung mit 200 OK gibt es nicht. Wenn du mit Header und Location eine Weiterleitung machst, dann MUSS ein 3xx Code gesendet werden, sonst macht der Browser des Clients nichts. Wenn du den Code weglässt, benutzt PHP automatisch den Code 302 (Redirect ohne Angabe ob temporär oder permanent).

Steht übrigens auch in der Dokumentation:
http://de.php.net/manual/en/function.header.php
Whiteknight KKK

RANG Deckschrubber

#22 - 17.08 09:14

danke danke danke