blog.bartlweb - a technologist's external brain

Alle Artikel

mit htaccess alte Websites auf neue umleiten

Gerade beim Relaunch von Websites lässt sich eine Änderung in der Seiten- und Pfadstruktur nicht immer vermeiden. Damit alte Links aber weiterhin funktioniern kann man alte Seiten mittels Apache htaccess auf neue umleiten.

Einzelseiten umleiten

Redirect 301 /folder/file.html http://www.newsite.com/folder/file.html
Redirect 301 /folder/file.html /newfolder/file.html

Ordner umleiten

RewriteEngine On
RewriteRule ^folder/(.*) http://www.example.com/newfolder/$1 [R=301,L]
RewriteRule ^folder/subfolder/(.*) /folder/$1 [R=301,L]

alle Seiten einer Website umleiten

RewriteEngine On
RewriteRule .* maintenance.html [L]

alle Seiten auf die Hauptseite umleiten

Wollen Sie eine Seite offline nehmen und daher für alle Aufrufe eine einzige Seite anzeigen, dann hilft folgendes Snippet. Sie müssen die Liste der Dateiendungen entsprechend Ihren Bedürfnissen anpassen um Datei-Requests bei Bedarf ebenfalls auf die Landingpage umzuleiten. Nennen Sie Ihre Landingpage index.html oder passen Sie den Dateinamen unten an.

TYPO3-Website in den Wartungsmodus versetzen

Gerade bei TYPO3-Updates kann es zu kurzen Ausfällen der Frontend-Ausgabe kommen. Damit Nutzer diese Ausfälle nicht sehen lässt sich mittels .htaccess für dieses Zeit eine Vorschaltseite anzeigen. Das folgende Snippet hat dabei den Vorteil, dass das TYPO3-Backend dennoch erreichbar bleibt.

RewriteEngine On
RewriteRule ^(typo3/|t3lib/|tslib/|typo3conf/|typo3temp/|_asmaintenance/) - [L]
RewriteRule ^typo3$ typo3/index_re.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule index.php maintenance.html [L]
RewriteRule .* maintenance.html [L]

TYPO3-Sprachdateien mit PHP und SimpleXML einlesen

Wer TYPO3-Sprachdateien unabhängig der TYPO3-API mit PHP verarbeiten möchte kann diese mittels SimpleXML in PHP einlesen. Der folgende Code liefert die Werte der angegebenen Sprache als Array zurück. Vergessen Sie nicht das die Sprache Englisch nicht als en sondern als default angegeben werden muss.

$langFile = 'typo3conf/ext/myext/pi2/locallang.xml';
$language = 'de';
 
xml = @simplexml_load_file(PATH_site . $langFile);
 
if($xml ===  FALSE) {
  echo 'Error: Could not read xml file.';
}
 
$labels = array();
foreach($xml->data->languageKey as $xmllanguage) {
    if($xmllanguage->attributes()->index == $language) {
        foreach($xmllanguage as $value) {
            $labels[(string) $value->attributes()->index] = (string) $value;
        }
    }
}

Word-Serienbrief in einzelne Word- oder PDF-Dateien speichern

vereinfachte und verbesserte Version:

formletter2pdf - die Weiterentwicklung des Makros als Open Source-Projekt, mit Einstellungsdialog und Schritt-für-Schritt Anleitung:

www.formletter2pdf.com

Das folgende Makro für Microsoft Word 2007 und Word 2010, dient dazu die einzelnen Schreiben der Serienbrieffunktion als getrennte Dateien zu speichern. Das Makro erfragt nach dem Start nach dem Speicherort. Dabei wird am Speicherort automatisch ein Ordner der die Serienbriefe enthält erstellt. Der Dateiname der einzelnen Dateien wird dabei aus einem der Datenfelder des Serienbriefs generiert. Um die Generierung der Serienbriefe zu beschleunigen, wird während des Vorgangs das Word-Fenster ausgeblendet.

Website als iPhone bzw. iPad-App

Damit unter iOS eine Website am Dashboard als Icon angelegt werden kann bedarf es nur ergänzenden Meta-Informationen im HTML-Header.

Website als App definieren

Des folgenden Meta-Attribut gibt iOS die Anweisung die Website als App behandeln zu können. Dadurch wird dem Nutzer innerhalb von Safari die Option eine Verknüpfung der Website auf das Dashboard zu erstellen angezeigt.

<meta name="apple-mobile-web-app-capable" content="yes" />

Icon für das Dashboard

Damit wir alle Auflösungsdichten der unterschiedlichen iPhone und iPad-Modelle abdecken muss das Logo in 3 verschiedenen Auflösungen eingebunden werden.

TYPO3 Benutzer aus einer Extension heraus anmelden

Um alternative Login-Methoden zu basteln kann es hilfreich sein zu wissen wie ein bestehender TYPO3-Benutzer aus einer Extension heraus im Frontend angemeldet werden kann. Sobald der Benutzer angemeldet ist greifen damit sämtliche Seiten und Inhaltsberechtigungen.

$loginData=array(
    'uname' => $this->config['dummyUsername'],
    'uident'=> $this->config['dummyPassword'],
    'status' =>'login'
);
$GLOBALS['TSFE']->fe_user->checkPid=0;
$info= $GLOBALS['TSFE']->fe_user->getAuthInfoArray();
$user=$GLOBALS['TSFE']->fe_user->fetchUserRecord($info['db_user'],$loginData['uname']);
 
$ok=$GLOBALS['TSFE']->fe_user->compareUident($user,$loginData);
if($ok) {
  //t3lib_div::debug("login success");
  $GLOBALS['TSFE']->fe_user->createUserSession($user);
} else {
  //t3lib_div::debug("login failed");
}
 
$GLOBALS['TSFE']->fe_user->user = $GLOBALS['TSFE']->fe_user->fetchUserSession();
$GLOBALS['TSFE']->fe_user->fetchGroupData();

Server mit iptables absichern

Die folgende Anleitung erläutert wie mit Hilfe von iptables der Zugriff auf Serverdienste aus dem Netzwerk abgesichert werden kann. Nähere Information zu iptables finden sich auch in der Online-Dokumentation von Ubuntu: https://help.ubuntu.com/community/IptablesHowTo

iptables konfigurieren

Als erstes müssen die iptabels-Regeln erstellt werden. Dazu müssen Sie die folgenden Befehle auf der Konsole eingeben.

iptables -A INPUT -p tcp --dport 22 -m recent --set --name ssh --rsource
iptables -A INPUT -p tcp --dport 22 -m recent ! --rcheck --seconds 60 --hitcount 4 --name ssh --rsource -j ACCEPT
 
iptables -A INPUT -p tcp --dport 3306 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP

Die erste Regel unterbindet eine Dictionary-Attacke auf den SSH-Zugang in dem nur 4 Verbindungsversuche pro 60 Sekunden zugelassen werden . Die zweite Regel unterbindet jeglichen Zugriff auf den MySQL-Standardport.

VPN auf HostEurope-vHosts

Durch das Fehlen des PPP-Kernelmoduls auf den vHosts von HostEurope fällt der Einsatz von PPTP als VPN-Variante leider aus. Abhilfe schafft OpenVPN allerdings nur im Tun-Modus, da ein ebenfalls fehlendes Bridging-Modul den Einsatz der bridged-Variante unterbindet. Der Vorteil des Tun-Modus - er funktioniert auch mit den oben genannten Einschränkungen. Der Nachteil des Tun-Modus - es kann sich immer nur ein Benutzer zur selben Zeit verbinden.

Die folgende Anleitung beschreibt die Konfiguration von OpenVPN im Tun-Modus auf einem Ubuntu-Server.

OpenVPN installieren

Zunächst müssen Sie OpenVPN und OpenSSL auf Ihrem Server installieren.

ImageMagick verursacht hohe Prozessorauslastung auf HostEurope-vHosts

Bei der Einrichtung eines virtuellen Servers von HostEurope bin ich vor dem Phänomen einer extrem hohen Prozessorlast bei Nutzung von ImageMagick gestanden. Dabei dauerte z.B. der Aufruf einer TYPO3-Seite mit Grafiken bis zu einer Minute.

Dabei handelt es sich um ein Problem mit dem durch Ubuntu zu verfügung gestellten ImageMagick-Paket und der Konfiguration der virtuellen Servern durch HostEurope. Abhilfe schafft eine manuelle Installation von ImageMagick ohne MulitCore-Unterstützung. Eine Anleitung findet man in den FAQ's von HostEurope.

https://faq.hosteurope.de/view.php?mode=drucken&content_id=8409

MySQL Datenbank in UTF-8 konvertieren

Um eine Datenbank im laufenden Betrieb in UTF-8 zu konvertieren bedarf es einiger Anpassungen. Das folgende PHP-Skript erleichtert die Konvertierung.

<?php
 
/* settings */
 
$db = 'test';
$db_host = 'localhost';
$db_username = 'username';
$db_password = 'password';
 
/* action */
 
// connect to db
$dbconection = mysql_connect($db_host, $db_username, $db_password);
if(!$dbconection) {
    echo "Error: Database connection to host '" . $db_host . "' can't be established!" . "<br/><br/>";
    exit(0);
} else {
    echo "Database connection to host '" . $db_host . "' established!" . "<br/><br/>";
}
mysql_select_db($db);
 
// convert
$result = mysql_query('show tables');
if($result) {
    
    echo "Database '" . $db . "' selected!" . "<br/><br/>";  
 
    // convert tables
    if(mysql_num_rows($result)) {
        while($tables = mysql_fetch_array($result)) {
            foreach ($tables as $key => $value) {
                $query = "ALTER TABLE " . $value . " CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;";
                mysql_query($query);
                if (mysql_error()) {
                    echo mysql_error() . "<br/>";
                    echo "ERROR: " . $query . "<br/>";
                } else {
                    echo "SUCCESS: " . $query . "<br/>";
                }
            }
        }
    }
 
    // set collation to utf8
    $query = "ALTER DATABASE dev_aopwebsites DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci";
    mysql_query($query);
    if (mysql_error()) {
        echo mysql_error() . "<br/>";
        echo "<br/><br/>" . "ERROR: " . $query . "<br/>";
    } else {
        echo "<br/><br/>". "SUCCESS: " . $query . "<br/>";
    }
 
    echo "<br/><br/><br/>" . "SUCCESS!" . "<br/>";
 
} else {
    echo "<br/><br/><br/>" . "ERROR - Database '" . $db . "' not found!" . "<br/>";
}
 
?>