Tutorial: mod_rewrite auf Ubuntu-Rechner mit Apache2

Wer einen frischen Ubuntu-Rechner mit LAMP versorgen will, braucht oft auch mod_rewrite und htaccess, um, so wie ich, zum Beispiel die Urls schöner darstellen zu können. Da ich heute vor demselben Problem, wie vor vier Jahren stand (neuer Rechner, der mit mod_rewrite versorgt werden soll), will ich hier eine Anleitung schreiben.

Zuerst: mod_rewrite aktivieren

sudo a2enmod rewrite

Dann: Nötiges Verzeichnis anlegen:

sudo mkdir -p /var/run/apache2
sudo chown -R www-data /var/run/apache2 

Nun: Die Apache2-Config bearbeiten:

sudo gedit /etc/apache2/apache2.conf

Dort:

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>

Das AllowOverride auf „All“ setzen:

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride All
	Require all granted
</Directory>

Anschließend: Neu laden:

sudo /etc/init.d/apache2 force-reload 

Zu beachten:

Anders als auf Debian-Servern, wird auf Ubuntu-Rechnern das aktuelle Verzeichnis anders darstellt:

# AUF UBUNTU-RECHNER:
Options -Indexes
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^([^/]*)$ ./index.php?site=$1 [L]
</IfModule>
# AUF DEBIAN VSERVER:
# Options -Indexes
# <IfModule mod_rewrite.c>
# RewriteEngine On
# RewriteRule ^([^/]*)$ /index.php?site=$1 [L]
# </IfModule>

(Auf Ubuntu: „./index.php“, auf Debian-Server: „/index.php“)

Spam unter WordPress ohne Plugins verhindern!

Ich habe bei einem meiner Projekte das Problem, dass ich WordPress verwende, allerdings keine Plugins oder Themes verwenden kann. Wie verhindert man also bei so einem Projekt Kommentar-Spam?

Es ist eigentlich ganz einfach: Man baut in die functions.php ein paar neue Funktionen gegen Spam ein:

1. Webseiten-Feld entfernen!

Spammer / Spam-Bots wollen ihre Webseite bekannter machen, gibt es kein -Webseiten-Feld ist das Risiko niedriger, dass Spam gepostet wird.

PHP-Code:

function remove_comment_fields($fields) {
    unset($fields['url']);
    return $fields;
}
add_filter('comment_form_default_fields','remove_comment_fields');
 
function rkv_url_spamcheck( $approved , $commentdata ) {
   return ( strlen( $commentdata['comment_author_url'] ) > 1 ) ? 'spam' : $approved;
}
 
add_filter( 'pre_comment_approved', 'rkv_url_spamcheck', 99, 2 );

Diese Funktion entfernt das Webseiten-Feld und markiert Kommentare mit Webseite automatisch als Spam. (Quelle: catswhocode.com)

2. Kommentare mit Links entfernen

Als Nächstes weist man die Besucher des Blogs darauf hin, dass Links in den Kommentaren verboten sind und baut die folgende von mir erstellte Funktion ein, die Kommentare mit Links erkennt.

PHP-Code:

// BBCodes und HTML-Links erkennen - Wronnay.net
function wy_link_on_comment() {
if(stristr($_POST['comment'],"[link=") || stristr($_POST['comment'],"[url=") || stristr($_POST['comment'],"a href=") || stristr($_POST['comment'],"http://")){
wp_die( __('Bitte keine Links posten!') );
}
}
add_action('pre_comment_on_post', 'wy_link_on_comment');

Die Funktion erkennt sogenannte BBCodes, die eigentlich gar nicht in WordPress verwendet werden und normale HTML-Links und weist den Autor darauf hin, dass Links nicht erlaubt sind.

Update (23.04): Ich habe jetzt „ || stristr($_POST[‚comment‘],“http://“)“ hinzugefügt. Der Code erkennt jetzt alle Links.

CSS Tutorial: Personalisierte Checkboxen

Wie ich bereits berichtet habe, nutze ich seit Kurzem personalisierte Checkboxen. In diesem Tutorial möchte ich zeigen, wie das funktioniert.

Zuerst der HTML-Teil:

<span>
  <input type="checkbox" name="channel[]" id="channel1" class="checkbox" value="wronnaysblog">
  <label id="lbl1" for="channel1"> Wronnays (B)log</label>
</span>
<span>
  <input type="checkbox" name="channel[]" id="channel2" class="checkbox" value="wronnaycms">
  <label id="lbl2" for="channel2"> WronnayCMS</label>
</span>
<span>
  <input type="checkbox" name="channel[]" id="channel3" class="checkbox" value="forenhosting">
  <label id="lbl3" for="channel3"> ForenHosting.net</label>
</span>
<span>
  <input type="checkbox" name="channel[]" id="channel4" class="checkbox" value="webpage4me">
  <label id="lbl4" for="channel4"> WebPage4.Me</label>
</span>
<span>
  <input type="checkbox" name="channel[]" id="channel5" class="checkbox" value="cdm">
  <label id="lbl5" for="channel5"> C D Ms Blog</label>
</span>

Nachfolgend der CSS-Teil:

span {
  margin-bottom:1em;
}
input[type="checkbox"],
label[for] {
  display:inline-block;
}
label[for] {
  margin-left:1em;
  cursor:pointer;
}
input[type="checkbox"] {
  visibility:hidden;
}
input[type="checkbox"] + label[for] {
  margin-left:-1em;
}
input[type="checkbox"] + label[for]:before {
  content:"\2713";
  color:white;
  background:white;
  border:1px solid grey;
}
input[type="checkbox"]:checked + label[for]:before {
  color:black;
}
input[type="checkbox"] + label[for]:hover:before,
input[type="checkbox"] + label[for]:focus:before {
  color:grey;
}

content:“\2713″; zeigt das eigentliche Checkbox-Symbol. Das verstecken wir mit „color:white;“ und „background:white;“. Da wir mit „input[type=“checkbox“]:checked“ definieren, wie die Checkbox angeklickt aussehen soll und da „color:black;“ angegeben wurde, wird das Checkbox-Symbol nach dem Anklicken schwarz. Mit „label[for]:hover:before“, „label[for]:focus:before“ und „color:grey;“ geben wir dann noch an, dass das Checkbox-Symbol bei einem Hover- und Focus-Effekt grau sein soll.

Mehrsprachige Webseiten und Suchmaschinenoptimierung

Eine mehrsprachige Webseite ist etwas Schönes. Durch die Vielfalt der Sprachen kann man meist mehr als doppelt so viele Nutzer ansprechen wie vergleichbare einsprachige Webseiten. Allerdings gibt es bei mehrsprachigen Webseiten auch einen Haken: Entweder muss der Nutzer selbst die Sprache auswählen oder die Webseite liest die Daten von dem Browser aus. Das Problem ist, dass Suchmaschinen keine Sprachdaten an die Webseite übermitteln. Also wird die Webseite bei Suchmaschinen mit der Standard-Sprache ausgeliefert (meist ist dies Englisch). So wird aus einer zweisprachigen Webseite bei Google ganz schnell eine einsprachige Webseite. Ich möchte nun meine Lösung zu diesem Problem präsentieren: zwei Domains (bzw.: Subdomains). Denn wenn man zwei Domains für eine Webseite hat, dann kann man die Sprachauswahl so einstellen, dass wenn keine Sprachdaten gefunden werden, einfach die eine Webseite auf Deutsch ausgeliefert wird und die andere auf Englisch. So findet Google statt einer mehrsprachigen Webseite zwei Webseiten mit jeweils einer anderen Sprache. Dies ist optimal für die Suchmaschinenoptimierung.

Hier noch ein Beispiel in PHP:

    if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) // Sind Sprachdaten vorhanden?
    {
      $_SESSION['lang'] = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
    }
	else // Keine Sprachdaten vorhanden!
    {
if($_SERVER['SERVER_NAME'] == 'homepage-versammlung.tk') {$_SESSION['lang'] = 'de';}
elseif($_SERVER['SERVER_NAME'] == 'homepage-meeting.tk') {$_SESSION['lang'] = 'en';}	
else {$_SESSION['lang'] = 'en';} 	
    }

Wie man ein Cover erstellt!

Hi, da ich selber gerade versuche von ein paar Cover zu erstellen, möchte ich heute zeigen, wie man ein Cover erstellt.

  1. Ein passendes Lied suchen
  2. Das Lied downloaden (Falls man es noch nicht hat)
  3. (Nur wenn man kein Instrumental-Teil erstellen will) nach den reinen Instrumental-Teil des Songs suchen (Auf YouTube z.B.: mit „Eminem – The Real Slim Shady – Instrumental„)
  4. Nach den Lyrics googeln (z.B.: „Eminem – The Real Slim Shady – Lyrics„)
  5. Die Lyrics ausdrucken
  6. Audacity herunterladen (Falls nicht vorhanden)
  7. Mikrofon (Es geht auch das vom Headset) anschließen
  8. In Audacity ein neues Projekt erstellen, die Instrumental-Datei importieren (evtl.: auch das ganze Lied importieren, falls man zusammen mit dem Songtext singen will)
  9. Aufnahme starten (Normalerweise sollte beim Aufnehmen die importierte Datei abgespielt werden, falls man das nicht mag, kann man es abstellen)
  10. Ergebnis anhören (evtl.: noch bearbeiten)

PS.: Vielleicht veröffentliche ich bald ein paar Lieder 😀

Alternativer Server (PHP Tut)

<?php
error_reporting(0);
ob_start();
function pingSite($webserver) 
{ 
   foreach ($webserver as $key => $host) 
    { 
        $fp = curl_init($host['url']);
        curl_setopt($fp,CURLOPT_TIMEOUT,10);
        curl_setopt($fp,CURLOPT_FAILONERROR,1);
        curl_setopt($fp,CURLOPT_RETURNTRANSFER,1);
        curl_exec($fp);
        if (curl_errno($fp) != 0)  
        { 
            $webserver[$key]['status'] = false;
        } 
        else  
        { 
            $webserver[$key]['status'] = true;
        } 
        curl_close($fp);
    }
    return $webserver;
} 
$webserver[0]['name'] = 'lima-city';
$webserver[0]['url'] = 'http://webfreclan.lima-city.de';
$webserver = pingSite($webserver);
?>
<html>
<head>
<title>Server Check</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?PHP
foreach ($webserver as $key => $host) 
{ 
   if(!$host['status'])
   {
    echo 'Die Server sind zurzeit offline!';
	Header("Location: http://www3.wronnay.tk");
   }
   else
   {
    echo 'Die Server sind zurzeit online!';
    Header("Location: http://webfreclan.lima-city.de");
   }
}  
?>
</body>
</html>
<?php
ob_end_flush();
?>

Dieser Code überprüft, ob der Server „http://webfreclan.lima-city.de“ online ist und leitet im Fall, dass er offline ist, auf http://www3.wronnay.tk weiter.

Eigene Teilen-Icons für Facebook, Google+ und Twitter

Ich arbeite gerade an einem News-Portal, bei dem die Leser die Artikel natürlich auch über Facebook, Twitter und Google+ teilen können sollen. Da mir die Plugins nicht gefallen, habe ich die Icons von elegant themes genommen und sie mit den entsprechenden Links verknüpft.

Hier der HTML-Code für die eigenen Teilen Icons:

<a href="http://www.facebook.com/sharer.php?u=[Url]&t=[Titel]"><img src="icons/facebook.png"></a>
<a href="http://twitter.com/home?status=[Titel] - [Url]"><img src="icons/twitter.png"></a>
<a href="https://plus.google.com/share?url=[Url]&title=[Titel]"><img src="icons/google.png"></a>

([Titel] muss durch den Titel der Seite ersetzt werden und [Url] mit der Url der Seite.)

Anti Spam Updates + Tutorial

In meinen letzten Beitrag habe ich berichtet, dass ich ein SPAM-Problem hatte. Dieses habe ich jetzt beseitigt und gleich ein neues Script namens „AntiSpam NewsSystem“ zum Download bereitgestellt. Wie ich das angestellt habe, möchte ich in diesem Artikel erklären:

Zuerst sollte man wissen, dass SPAM-Autoren meistens keine Menschen, sondern Programme („Spambots“) sind, die das Web ähnlich wie Google durchsuchen und versuchen, in jeden Formular, dass sie finden, Werbung einzutragen. Dabei füllen die Spambots meistens typisch benannte Formulare aus, die man meistens ausfüllen muss (also z.B.: Email, Text, Betreff, Name, …). Das kann man sich zunutze machen, indem man ein Feld mit dem Namen „Email“ anlegt, den Besucher aber seine E-Mail-Adresse in das Feld „hallo“ eintragen lässt. Danach überprüft man, ob in das Feld „Email“ etwas eingegeben wurde und wertet es dementsprechend aus. Sollte das immer noch nicht funktionieren, überprüft man noch, ob Wörter wie „Viagra“ oder „Buy“ eingegeben wurden.

Hier meine Lösung:

Zuerst das HTML-Formular:

<form action="" method="post">
<p class="hallo"><input id="email" type="text" name="email" value="" size="60" /></p>
Kommentar schreiben:
<textarea class="li" name="comment" rows="5" cols="40"></textarea>
Ihr Name: <input class="li" type="text" name="name" />
<input class="lb" type="submit" name="submit" value="Kommentieren" />
</form>

Dann muss man noch per CSS die Class „hallo“ auf dispaly:none; setzen (So sehen die Besucher die Email-Abfrage nicht):

.hallo {display:none;}

Und abschließend wird mit PHP überprüft, ob etwas in das Feld „Email“ eingegeben wurde (der Besucher also ein Spambot ist):

<?php
  if(isset($_POST['submit']) AND $_POST['submit'] == "Kommentieren") {
	  if(isset($_POST['email']) && $_POST['email']) {
	  echo"<div class=\"fehler\">You are an SPAM-Bot!</div>";
	  }
      // hier dann noch der restliche Code...
  }
?>