Jörg Reinholz: Datumsabhängige URL veränderung

Beitrag lesen

@@I.Curtis:

  1. den aktuellen Zeitpunkt ermittelt

$y=date('Y-m'); # liefert für März 2013 etwas wie '2013-03', das verwenden wir aber nicht so.

  1. daraus einen formatierten String wie "0113" bekommt

Ich würde das etwas anders machen. Und zwar prüfen, ob die Datei existiert und lesbar ist und ggf. eine frühere Version ausliefern.

Zunächst die Konfiguration. Wenn der Variablenname geändert wird muss dieses beim Aufruf der Funktion getTDMFilename($tdtPath) mit geändert werden:

$tdmPath="/tip_des_monats/"; #relativer Pfad ab Document Root Verzeichnis auf dem Server!

  1. wie man ".html" anhängt (falls das nötig sein sollte; bei Apaches MultiViews ist es das nicht)

implizit erledigt

  1. wie man weiterleitet, ggfs. mit HTTP-Statuscode (302 Moved Temporarily ist Default \o/)

Wir brauchen das Protokoll:
$_SERVER['SERVER_PROTOCOL'] liefert sowas wie 'HTTP/1.1' oder HTTPS/1.1, das nutzen wir mit strpos aus, dass ein false zurück liefert, wenn der Suchstring nicht im Haystack enthalten ist:

if(false !== strpos('HTTPS', $_SERVER['SERVER_PROTOCOL'])) {  
    $p='HTTPS://';  
} else {  
   $p='HTTP://';  
}

Es folgt der
Das ist der Zusammenbau der neuen URL aus
dem Protokoll: HTTP://
dem Servername 'www.example.com'
dem Dateiname '/foo/2013-03.html' (wird in der eigenen Funktion getTdmUrl($tdtPath) ermittelt.Und der Anweisung als 'Begründung' für die Umleitung ein '307 Temporary Redirect' zu liefern.
'302 Found' kann auch sinnvoll sein. Das ist diskutierbar.

header('Location: '.$p.$_SERVER['HTTP_HOST'].getTdmUrl($tdmPath), TRUE, 307);

Fertig! Das ist natürlich schon eine Luxusversion, ohne die Nachsuche nach den Vormonaten für den Fall, dass noch keine Datei angelegt wurde gänge es sehr viel kürzer. Vorteile: Suchmaschinen können sich die alte Versionen der Tipps unter dem "richtigen" URL merken. Die alten Tipps kannst Du behalten und verlinken.

Ich würde die Dateien tatsächlich in einem Unterordner /Tipp_des_Monats/ speichern und unten stehendes Beispiel darin als index.php ablegen, die anderen nach folgendem Schema:

2013-03.html für März 2013.
2013-12.html für Dezember 2013

Hier die angesprochene Funktion, kommentiert:

function getTdmUrl($tdmPath) {

# wie oben besprochen: das Protokoll

if(false !== strpos('HTTPS', $_SERVER['SERVER_PROTOCOL'])) {
       $p='HTTPS://';
    } else {
       $p='HTTP://';
    }

# Ermitteln von Monat (ohne führende Null) und Jahr

$m=date('n');
    $y=date('Y');

# Da wir oben den relativen Pfad angeben müssen wir den vollständigen Pfad haben:

$DateiSystemPfad=$_SERVER['DOCUMENT_ROOT'].$tdmPath;

# Wir wollen nachschauen, ob es die Datei '2013-03.html' gibt. Falls nicht:
    # Vormonat - maximal zurück bis zum Januar 2013.

while ($y > 2012) {

# sprintf('%02d',$m) liefert den zweistelligen Monat (2013-03) statt 2013-3
        $f=$DateiSystemPfad.$y.'-'.sprintf('%02d',$m).'.html';
        # Nur für das Testen
        # print "teste $f\n";
        if ( is_file($f) && is_readable($f) ) {
            #Wenn die Datei gefunden wird und lesbar ist liefern wir
            # Protokoll, Servername und Ressource zurück
            return $p.$_SERVER['HTTP_HOST'].$tdmPath.$y.'-'.sprintf('%02d',$m).'.html';

}  else {
            #sonst: einen Monat zurück
            $m=$m-1;

# eventuell ein Jahr zurück und Monat auf 12:
            if (0==$m) {
               $m=12;
               $y=$y-1;
            }
        #Hier geht es zur Prüfung
        #aber nur wenn das Jahr noch > 2012 (siehe while($y > 2012)) ist
        }

}
    # Falls bis hier gar nichts gefunden wurde:
    return $p.$_SERVER['HTTP_HOST'].$tdmPath.'no_tip.html';
}

Und alles zusammen mit Tests, zu speichern als '/Tipp_des_Monats/index.php'
Aufruf mit http://www.example.com/Tipp_des_Monats/
(die index.php ist meist als Verzeichnis-Index konfiguriert)

<?php  
  
# Konfiguration:  
$tdmPath='/Tipp_des_Monats/';  
error_reporting(E_ALL);  
  
#Um lokal am Prompt zu testen ein Raute (#) vor den Slash in der Folgezeile setzen, sieht dann so aus: #/*  
/*  
$_SERVER['SERVER_PROTOCOL']='HTTP/1.1';  
$_SERVER['HTTP_HOST']='www.example.com';  
$_SERVER['DOCUMENT_ROOT']='/var/www';  
  
print 'Location: '.getTdmUrl($tdmPath)."\n";  
exit;  
#*/  
  
#Um auf einem Server zu testen ein Raute (#) vor den Slash in der Folgezeile setzen  
/*  
print 'Location: '.getTdmUrl($tdmPath);  
exit;  
#*/  
  
header('Location: '. getTdmUrl($tdmPath), TRUE, 307);  
  
function getTdmUrl($tdmPath) {  
    if(false !== strpos('HTTPS', $_SERVER['SERVER_PROTOCOL'])) {  
       $p='HTTPS://';  
    } else {  
       $p='HTTP://';  
    }  
    $m=date('n');  
    $y=date('Y');  
    $DateiSystemPfad=$_SERVER['DOCUMENT_ROOT'].$tdmPath;  
    while ($y>2012) {  
        $f=$DateiSystemPfad.$y.'-'.sprintf('%02d',$m).'.html';  
        #print "teste $f\n";  
        if ( is_file($f) && is_readable($f) ) {  
            return $p.$_SERVER['HTTP_HOST'].$tdmPath.$y.'-'.sprintf('%02d',$m).'.html';  
        }  else {  
            $m=$m-1;  
            if (0==$m) {  
               $m=12;  
               $y=$y-1;  
            }  
        }  
    }  
    return $p.$_SERVER['HTTP_HOST'].$tdmPath.'no_tipp.html';  
}  
?>  
  

Dieser Code ist getestet.

Die Datei 'no_tipp.html' sollte natürlich mit in dem Verzeichnis liegen, in dem die Tipps dann angelegt werden.

Nächste Ausbaustufe:

Dem Admin oder "Webmaster" ein Mail senden, wenn der Tipp des Monats nicht gefunden wurde... Das müsste einmalig nach dem } else {  und vor dem $m=$m-1; geschehen. Tipp dazu:

Checken, ob eine Datei 'warnung_gesendet' gefunden wurde,
  wenn nicht: Datei anlegen mit Funktion touch()
  Mails senden  mit Funktion mail()
  wenn gefunden: kein mail senden und natürlich auch keine Datei.

Der Admin oder "Webmaster" muss dann natürlich wissen, dass er die Datei 'warnung_gesendet' löschen muss, wenn er den Tipp des Monats erstellt hat. Das kann man aber mit in das Mail schreiben...

Jörg Reinholz