Zum Inhalt springen

[HOWTO] cmw_linklist mit echtem redirect

Erstellt am 4. Februar 2005 · 22 Antworten · letzte Antwort am 6. Dezember 2005 · Seite 1 von 2

Tags: Frage

typofritze ·

Hallo,

ich habe eine kleine Änderung an der cmw_linklist vorgenommen (Autor ist informiert!).

Bislang funktionierte die Weiterleitung zur verlinkten Seite per Javascript redirect.

Ich wollte aber gerne per PHP einen Header senden, weil es schneller geht (sonst wird ja erst die halbe Seite geladen, um dann per JS wieder weitergeleitet zu werden).

Entscheidend dabei ist, dass der Counter trotzdem erhöht wird.

In Zeile 309 habe ich $markerArray["###LINK_HREF###"] anders belegt:

$markerArray["###LINK_HREF###"] = "redirect.php?link=".$links[$i]['href']."&uid=".$uid;

Im Rootverzeichnis des Servers liegt eine redirect.php folgenden Inhalts:

<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Datum aus Vergangenheit
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // immer geändert
header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); // HTTP/1.0

//Bis hier war Proxy verhinderung.

// Mit Datenbank verbinden:

function db_connect() {
   $host     = "host";
   $user     = "user";
   $password = "password";
   $database = "database";

   $link_id = @mysql_connect($host, $user, $password);
   @mysql_select_db($database);
   return $link_id;
}

$db = db_connect();

//Counter erhöhen:

$sql = mysql_query("UPDATE tx_cmwlinklist_link SET clicks = clicks + 1 WHERE uid = '$uid'") or die (mysql_error());
$result = mysql_query($sql,$db);

// Weiterleiten:
header("Location: $link"); // Umleitung des Browsers
exit;
?>

Ich weiss nicht, ob der Code so oder ähnlich in die Extension aufgenommen wird. Ihr müsst also selber wissen, ob ihr so lange wartet.
Ganz Eilige wissen jetzt zumindest, wie es geht ;-)

Viele Grüsse,
Andreas

SLAng ·

Jo hallo auch...

habe deinen Vorschlag gerade mal ausprobiert und bin zunächst zu einem negativen Ergebnis gekommen denn es hat nicht funktioniert.

Nachdem ich das hier in meine redirect.php eingebaut hatte, funktionierte es dann:

//Zählen und Link:
$uid=$_GET['uid'];
$link=$_GET['link'];

irgendwie wurde vorher uid und link nicht gefunden, da die in deinem Script auch nicht angegeben wurden.

Die komplette redirect.php sieht dann so aus:

<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Datum aus Vergangenheit
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // immer geändert
header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); // HTTP/1.0

//Bis hier war Proxy verhinderung.

// Mit Datenbank verbinden:

function db_connect() {
   $host     = "host";
   $user     = "user";
   $password = "password";
   $database = "database";

   $link_id = @mysql_connect($host, $user, $password);
   @mysql_select_db($database);
   return $link_id;
}

$db = db_connect();

//Zählen und Link:
$uid=$_GET['uid'];
$link=$_GET['link'];

//Counter erhöhen:
$sql = mysql_query("UPDATE tx_cmwlinklist_link SET clicks = clicks + 1 WHERE uid = '$uid'") or die (mysql_error());
$result = mysql_query($sql,$db);

// Weiterleiten:
header("Location: $link"); // Umleitung des Browsers
exit;
?>

War das nun ein Fehler des Scripts? Oder ist es so, das bei mir vielleicht die Variablen uid und link nicht standardmäßig übergeben werden?

Trotzdem vielen Dank für das Script

mic_jan ·

Da ich keine Ahnung von PHP habe, aber dieses JS auch verhindern möchte, eine kleine Frage, welchen Header hat denn die Seite? Wird ein 302 ausgegeben?

Lieben Gruss,

Michael

mic_jan ·

Da ich den PHP-Code nicht verstehe... versuche ich es mal in meinen eigenen Worten zu beschreiben:
Also, der Redirect wird dem Besucher im Header mitgeteilt. 404-Fehlerseiten und sowas sind ja bekannt.

Man kann Weiterleitungen auch darüber realisieren, dass man einen 302- oder 301 Code übergibt. (302==> temporär, 301==> permanent).

Das momentane Problem bei diesen Redirects besteht darin, dass Google die Zielseite abstraft, indem im Index der erzeugte Link der Linkseite den Platz der Startseite annimmt. Im schlimmsten Fall, stirbt die Domain so langsam in Google aus.

Und ich glaube, dass sollte nicht das Ziel einer Linkseite sein!?

Konntest du meine Ausführungen verstehen?

Lieben Gruss

Michael

P.S.: Im Netz gibt es ein paar Tools, die einem die Header einer Seite ausgeben, bei Interesse kann ich den hier posten.

typofritze ·

Hallo,

du benötigst das $_GET, falls register globals in der php.ini auf off steht. Das ist bei neueren PHP-Versionen standardmäßig der Fall, hängt aber natürlich vom Server ab.
Deine Version funktioniert dann aber auf jeden Fall.
Da habe ich etwas schlampig programmiert ;-)

Viele Grüsse,
Andreas

SLAng ·

@ Typo Fritze:

Na na na! Schlampig will ich nicht gehört haben! :-)
Deine kleines redirect ist auf jeden Fall 1000 mal besser als das was vorher da war. Wer will schon, wenn er auf einen Link zu einer anderen Seite klickt die selbe Seite bis zur Hälfte neu laden lassen, bis man auf die gewünschte Seite kommt.

Wie auch immer. Wäre natürlich schön, wenn der Urheber das in seine Ext aufnehmen würde. Ist doch ein Fortschritt!

Nochmal besten Dank von mir!

typofritze ·

Genau das war auch meine Motivation.
Ich habe dem Autor den Code bereits gesendet. Wir werden sehen, was er daraus macht.

Freut mich, dass es bei dir läuft 😃

Viele Grüsse,
Andreas

Wu-mc ·

Hallo typofritze,

angespornt von deiner Idee wollt ich das auch mal versuchen, da der JS Redirect wirklich nicht gerade schön ist. Allerdings funktioniert das ganze bei mir nicht richtig, nach einem Klick auf den Link der z.B. zu www.nw-software.com leiten soll bekomm ich in der Adressleiste des Browsers die aktuelle plus die richtige Adresse also z.B. www.svamtzell.de/www.nw-software.com und das das nicht funktioniert kannst du dir ja denken.

Hab ich was falsch gemacht? Hat es vielleicht was mit dem Rootverzeichnis des Servers zu tun? Weil du schreibst direkt ins Rootverzeichnis des Servers, wenn ich es dort ablege geht aber garnichts. Habe dort den Ordner www.svamtzell.de. Als ich die redirect.php dort abgelegt hatte funktionierte das Script bis auf den oben genannten Fehler. Muss ich da was umschreiben?

typofritze ·

Das ist schon mal korrekt.
Und die redirect.php wird auch gefunden?
Bist du sicher, genau meinen Code verwendet zu haben?
(Copy & Paste)

Wu-mc ·

Naja ich denke mal schon, zuerst hatte ich vergessen die Datenbankdaten einzugeben dann kam ein Connection error. Als ich diese nachgetragen hab hats dann soweit funktioniert, nur wenn ich auf den Link klicke kommt halt www.svamtzell.de/www.nw-software.com

Die Klicks werden auch hochgezählt falls dir das was nützt.

Ich habe den editierten zweiten Code verwendet bei dem du meintest der müsste auch funktionieren!

typofritze ·
<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Datum aus Vergangenheit
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // immer geändert
header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); // HTTP/1.0

$link=$_GET['link'];

// Weiterleiten:
header("Location: $link"); // Umleitung des Browsers
exit;
?>

Versuch mal nur diesen Code. Alles andere war ja nur für den Counter. Wenn das auch nicht geht, dann mach mal folgendes:

<?php

$link=$_GET['link'];

echo $link;
?>

und sag mir, was ausgegeben wird.

Wu-mc ·

also das erste hat wieder nicht funktioniert, genau der selbe Fehler wieder, also www.svamtzell.de/www.nw-software.com

Beim dem zweiten wurde www.nw-software.com ausgegeben!

Wu-mc ·

Hab das auch gerade festgestellt, so hat's funktioniert. Problem ist nur wenn die Benutzer die Links über den Assistenten im Backend eingeben wird das http:// automatisch weggelassen. Gibt es eine Möglichkeit einer If-Verzweigung die darauf überprüft ob der $link mit einem "h" anfängt und wenn ja dann wird

header("Location: $link");

ausgeführt und wenn nicht dann nimmt man

header("Location: http://$link");

Kann leider kein PHP, deswegen weiß ich nicht wie ich auf das "h" am Anfang überprüfen kann.

typofritze ·

klar geht das. Aber im Moment habe ich keine Lust dazu ;-)

Entweder versuchst du es mal selbt (Google nach "selfphp"), oder wartest, ob ich in den nächsten Tagen mal probier ;-)

Viele Grüsse,
Andreas

Wu-mc ·

ok dann schau ich selber mal nach, trotzdem vielen Dank für deine Mühe.

Hab das mal zu header (); gefunden:

Der zweite Spezialfall ist der "Location:" Header. Es wird nicht nur der Header an den Browser geschickt, sondern auch ein REDIRECT (302) Statuscode, wenn nicht bereits ein 3xx Statuscode gesendet wurde.

Das ist ja das was mic_jan geschrieben hat oder? Ist diese Art redirect nun okay oder "gefährlich"?

Wu-mc ·

mir ist nochmal was aufgefallen. Dein Script funktioniert super wenn man in der Linkliste auf einen Link klickt, geht man allerdings in die Detailansicht zu einem Link und klickt dort den Link an dann hat man wieder den JS Redirect. Man muss also weiter unten nochmal einen Marker ersetzen, Problem ist nur das dort wohl eine andere Variable für die URL verwendet wird und man deshalb nicht den Code von oben übernehmen kann.

Unter http://www.svamtzell.de/158.0.html kannst du dir ansehen was ich meine. Hast du dafür eine Idee?