Archiv für die Kategorie „Linux“
Der neue Server
Der Server, auf dem unter vielen anderen Seiten und Diensten, auch dieses Blog hier läuft, wird in den kommenden Tagen umgezogen. Zum einen sagt mir die aktuelle Linux-Distribution nicht mehr zu, zum anderen bietet mein Provider nach über 4 Jahren, in denen dieser Server in der aktuellen Form bereits besteht, für’s gleiche Geld inzwischen Server mit der doppelten Leistung und Ausstattung an. Die Gelegenheit ist also günstig.
Aktuell bereite ich im Hintergrund bereits das neue System vor. Wenn dieses soweit finalisiert wurde, wird es eine mehr oder weniger kurze Downtime geben, in der die Seiten umziehen. Entgegen dem professionellen Seitenhosting kann ich mir auf diesen Privatseiten ja bequem den Luxus gönnen und sagen: “It’s done, when it’s done!”
Ich weiß, das diese Seite mal nicht erreichbar sein könnte, trifft tausende da draußen schwer. .. , aber die Berufsehre gebietet es mir irgendwie diese erste Downtime über mehr als 5 Minuten überhaupt nach über 4 Jahren als geplant anzukündigen
MySQL Fehler unter Ubuntu “‘Can’t create table ‘/tmp/#sql7c49_2f_0′ (errno: -1)’ on query.”
Ich hatte heute auf einem MySQL Slave Server den folgenden Fehler bei der Replikation von einem Master MySQL Server:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: www.xxx.yyy.zzz
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: db.002174
Read_Master_Log_Pos: 342719703
Relay_Log_File: mysqld-relay-bin.000003
Relay_Log_Pos: 6458545
Relay_Master_Log_File: db.002170
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1005
Last_Error: Error ‘Can’t create table ‘/tmp/#sql7c49_2f_0′ (errno: -1)’ on query. Default database: ‘live’. Query: ‘create temporary table tmp_gen_table like tmp_to_gen_neu’
Skip_Counter: 0
Exec_Master_Log_Pos: 620120976
Relay_Log_Space: 4109869668
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
1 row in set (0.09 sec)
Ich musste recht lange suchen. Die o.g. Datei (/tmp/#sql7c49_2f_0.ibd) wurde zwar von mysql:mysql angelegt, jedoch war sie 0 byte groß. Im MySQL – Log fand ich nur den o.g. Fehler wieder. Also schaute ich im syslog und wurde fündig:
Jan 28 12:55:22 db kernel: [495131.291630] audit(1264679722.493:141): type=1503 operation=”file_lock” requested_mask=”wk::” denied_mask=”k::” name=”/tmp/#sql7c49_2f_0.ibd” pid=7924 profile=”/usr/sbin/mysqld” namespace=”default”
Das kenne ich inzwischen: Eine Zeile mit so komischen “requested_mask=”wk::”” – Rechten kommt meistens, wenn eine Applikation an apparmor scheitert. Ich habe also der Datei /etc/apparmor.d/usr.sbin.mysqld die folgenden Zeilen hinzugefügt:
/usr/sbin/mysqld {
…
/tmp/ r,
/tmp/** rwk,
}
Schon geht’s!
Ich fand es sehr überraschend, das das /tmp – Verzeichnis (in meinem Oldschool-Linux-Hinterkopf immer als das “jeder darf – Verzeichnis” abgelegt) ebenfalls einer eigenen Zeile in der apparmor-Konfiguration bedarf. Noch verwunderlicher finde ich, das dieses unter Ubuntu (8.04 – Hardy Heron) nicht standardmäßig dort aufgenommen wurde. Immerhin ist tmpdir=/tmp die Standardeinstellung unter dieser Ubuntu-Version.
Postgres Datenbankbackups per Script erstellen
Ich habe damals, als ich noch 0 Ahnung von Datenbanken hatte, mit PostgreSQL angefangen. Ich dachte in der Tat, das MySQL ja eine kommerzielle Anwendung ist und es ja daher jederzeit vorbei sein kann mit der freien Verfügbarkeit. Da ich eh keine Ahnung hatte, und PostgreSQL im Community – Mund sehr viel mehr können sollte als MySQL, hatte ich mich dafür entschieden.
Inzwischen kenne ich mich wenigstens etwas mit MySQL und dessen Administration aus und habe das zu meiner Standard-Datenbank gemacht. Von PostgreSQL komme ich wegen eines phpBB2 – Forums aber nicht mehr los – also habe ich mich auf die Suche nach einer Möglickeit gemacht, auch PostgreSQL Datenbanken automatisiert per Script Backupen zu können. Standardmäßig hat das Kommandozeilenprogramm “pg_dump” keinen Parameter für das Passwort wie “mysql” und “mysqldump”.
Es gibt dennoch einen ähnlich unsicheren Trick, wie man das ganze auf der Shell automatisieren kann: Die Umgebungsvariablen “PGUSER” und “PGPASSWORD”. Über die beiden folgenden Methoden kann damit die Authentifikation an der Postgres Datenbank durchgeführt werden:
export PGUSER=”postgres_user”
export PGPASSWORD=”Passwort”
pg_dump -f /DB.pgsqldump -F c -C -D -h localhost DBoder alles in einer Zeile:
PGUSER=”postgres_user” PGPASSWORD=”Passwort” pg_dump -f /DB.pgsqldump -F c -C -D -h localhost DB
Ich denke ich muss nicht erwähnen das dieses sehr unsicher ist. Während die Variablen gesetzt sind kann sie theoretisch fast jeder auf dem System auslesen. Daher sollte als Mindestsicherheitsmaßnahme unmittelbar nach dem dumpen der Inhalt der Variablen durch “unset PGUSER ; unset PGPASSWORD” wieder gelöscht werden. Aber es ist immerhin eine Möglickeit
Wenn der couriertcpd “malloc: Input/output error” meldet
Hab heute mal wieder eines dieser zunächst unerklärlichen Probleme gehabt:
- Der courier-authdaemond und der courier-imapd laufen seit JAHREN unverändert problemfrei.
- Ich habe nichts geändert.
- Trotzdem bekomme ich im mail.info – Log diese Zeile:
“couriertcpd: malloc: Input/output error”
Ich habe die Configs überprüft, Rechte im Dateisystem, alles. Nichts gefunden.
Schließlich bin ich im Archiv der courier-users Mailingliste auf die Lösung gestoßen:
Der Courier IMAPd arbeitet Standardmäßig mit dem FAM (File Alteration Monitor) zusammen. Scheinbar kommt der hin und wieder mal ins Straucheln und sollte in diesem Fall, zusammen mit dem portmap Daemon, neu gestartet werden.
Jean-Marc Liotier, der diesen Fehler auf der Mailingliste gepostet hatte, und auch mein Problem ließen sich jedenfalls so beheben.
Schon fies der Fehler, da im Log ja nur der couriertcpd auftaucht, woraufhin man ja zunächst mal geneigt ist hier nach dem Fehler zu suchen …
Fehlende Libraries bei VMware Server Installation unter Ubuntu auf einem x86_64 System
Hallo zusammen; kurzer HowTo-Flash:
Ich hatte eben Probleme den VMware Server unter einem Ubuntu x86_64 System zu installieren. Meine Bildschirmausgabe sah wie folgt aus:
The correct version of one or more libraries needed to run VMware Server may be missing. This is the output of ldd /usr/bin/vmware:
linux-gate.so.1 => (0xffffe000)
libm.so.6 => /lib32/libm.so.6 (0xf7f93000)
libdl.so.2 => /lib32/libdl.so.2 (0xf7f8f000)
libpthread.so.0 => /lib32/libpthread.so.0 (0xf7f76000)
libX11.so.6 => not found
libXtst.so.6 => not found
libXext.so.6 => not found
libXt.so.6 => not found
libICE.so.6 => not found
libSM.so.6 => not found
libXrender.so.1 => not found
libz.so.1 => /usr/lib32/libz.so.1 (0xf7f60000)
libc.so.6 => /lib32/libc.so.6 (0xf7e16000)
/lib/ld-linux.so.2 (0xf7fc6000)
This program cannot tell for sure, but you may need to upgrade libc5 to glibc
before you can run VMware Server.
Auf dieser Seite habe ich die Lösung gefunden:
Man muss das Paket “ia32-libs” nachinstallieren. Nun klappt alles
HTTP_HOST mit mod_rewrite verändern
Ich möchte heute einen mod_rewrite – Move veröffentlichen, den ich so im Internet (als ich ihn selber brauchte … *gnaaahr* ..
) nicht gefunden habe.
Erstmal: Worum geht’s?
Ich hatte auf der Arbeit folgende Aufgabe: Einer unserer Kunden hat mehrere Domains. Unter jeder dieser Domains gibt es einen DNS-Eintrag für jeden Server des Kunden. Zum Beispiel: server1.domain1.de , server1.domain2.de , … etc. In Einträgen mit gleichem Servernamen (server1) ist immer dieselbe IP hinterlegt.
Nun tauchten teilweise doppelte Einträge bei Suchmaschinen auf, wodurch das Ranking negativ beeinflusst wird. Es gab zum Beispiel diese beiden (fiktiven) Hits auf denselben Suchausdruck: http://server1.domain1.de/gartenzubehoer.html und http://server1.domain2.de/gartenzubehoer.html. Das ist natürlich eher nicht erwünscht.
Die Aufgabe bestand nun also aus 3 Punkten:
- Es sollen alle Anfragen von allen Domains auf eine einzige Hauptdomain mit einem RedirectPermanent (301) umgeleitet werden.
- Es muss erreicht werden, das der Subdomain – Teil (server1) mit übernommen wird und der Hauptdomain vorangestellt wird.
- Der URI-Teil nach dem Hostteil (/gartenzubehoer.html) muss in der neuen URI auch wieder angehangen werden.
Nun bietet mod_rewrite es in RewriteRule – Anweisung aber irgendwie nur an, den Teil nach dem Hostteil zu verändern/zu übernehmen. Somit hätte ich nur die Möglichkeit auf einen einzigen Server umzuleiten.
Es gibt auch die RewriteCond – Anweisung. Hiermit kann man auch die Variable HTTP_HOST auf bestimmte Inhalte hin überprüfen, jedoch nicht verändern.
Wie bekommt man es nun hin die Anfrage wie beschrieben zu manipulieren?
Lösung: Man kann mit einem regulären Ausdruck Werte aus der RewriteCond – Anweisung in der RewriteRule – Anweisung wiederverwerten!
Es folgt das Beispiel für die beschriebene Anforderung:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.*)\.domain.\.de$ [NC]
RewriteRule ^(.*)$ http://%1\.domain1\.de$1 [R=301,L]
Das wars! Das fiese: RewriteCond Speichert seine Pattern in Variablen, die mit %N angesprochen werden und RewriteRule in Variablen, die mit $N angesprochen werden! Mit diesem Wissen ist es eigentlich schon wieder ein Kinderspiel, wie man sieht.
Ich gehe die Zeilen schnell (!) durch:
Zeile 1: Aktiviert nur das mod_rewrite .
Zeile 2: RewriteCond ist eigentlich dazu da, um einen Request vor der Umformung zunächst mal durch verschiedene Prüfungen gehen zu lassen. Nur wenn alle RewriteCond Tests erfolgreich waren, wird die Manipulation durch RewriteRule vorgenommen. Hier dient uns die Anweisung jedoch dazu den HTTP_HOST auszulesen und in der Variable %1 zu speichern. Dieses wird durch die () erreicht (Siehe: Reguläre Ausdrücke). Die Option [NC] steht für “not casesensitive” und bewirkt, das es egal ist, ob jemand eine beliebige Kombination aus Groß- und Kleinschreibung in der URL verwendet.
Zeile 3: RewriteRule definiert nun wie genau die Anfrage manipuliert werden soll. der zweite Teil nimmt sich einfach alle Zeichen, die hinter dem Hostteil kommen und speichert sie in der Variablen $1. Anschließend wird das Ziel definiert. Hier werden beide Variablen, %1 und $1, wieder verwertet. Die Optionen [R=301,L] besagen nun, das es sich um eine Umleitung (Redirect) des Types 301 (permanent) handelt, und das dieses die letzte Regel sein soll, die angewendet wird (L).
Das ganze hat mich über 2 Stunden gekostet. Hab offenbar immer wieder übersehen, das es sich um zwei unterschiedliche Variablenregister bei %N und $N handelt.
Ich hoffe das dieses jemandem diese Zeit spart
Wie immer freue ich mich sehr über ein kurzes Feedback in Form eines Kommentars
Mit dem vim eine farbige motd erstellen
Hallo zusammen!
ENDLICH! Endlich habe ich den Kniff wieder gefunden!
Ich habe auf diesem Server, auf dem auch diese Homepage gehostet ist, eine farbige motd Datei angelegt. Hierin werden neben der IP und einem kleinen ASCII – Bildchen die auf diesem Server konfigurierten Domains aufgelistet.
Damals habe ich mir nicht weiter aufgeschrieben wie das geht, hatte ich das doch nach 1-2 Minuten googlen direkt gefunden.
Heute laufen auf demselben Server, auf dem früher nur diese eine Domain, zoosau.de, lief schon 6.
Natürlich wollte ich die neuen 5 Domains immer auch gerne in diese Datei eintragen, jedoch fand ich auf Teufel komm raus den Kniff nicht mehr, wie das geht mit farbigem Text!
Heute bin ich der Sache endlich deutlich näher gekommen. Damit ich das nächste Mal nicht wieder umsonst Ewigkeiten suche, beschreibe ich das Vorgehen hier.
Zunächst öffnet man eine Datei, oder legt halt mit dem vim eine neue an. Will man nun … sagen wir: Rot, blinkend und auf grünem Hintergrund schreiben, dann begibt man sich zunächst in den Insert – Modus (i) und drückt dann STRG+v , gefolgt von der “Pfeiltaste-nach-rechts”-Taste. Man sieht nun folgendes erscheinen: “^[OC ” , wobei der Teil “^[” blau dargestellt wird (sofern Konsole und vim auf farbige Darstellung konfiguriert sind). Die letzten beiden Zeichen, das “OC” löscht man nun wieder – es geht um darum, das man die Escape-Character “^[” erzeugt hat. Warum man nicht einfach “^[” eintippt? Nun: Testet meine Methode und vergleicht das Ergebnis mit dem Vorgehen “^[” nur einzutippen
Es wird dann halt als die Zeichen “^[” eingefügt, nicht aber als die Kontrollzeichen. Diese werden nur als blaue “^[” angezeigt; eigentlich stecken da ganz andere Codes hinter. Schwer zu erklären, einfach mal nach “escape sequences” googlen.
So, damit wird die Sequenz eingeleitet. Nun müssen wir eingeben, was wir darstellen wollen. Ein Blick in die Manpage von “dir_colors” gibt uns hier ein paar Möglichkeiten an die Hand. Man kann hier verschiedene Werte übergeben, welche durch ein “;” getrennt und durch ein weiteres “[” initialisiert werden. Für unser “Rote, blinkende Schrift auf grünem Grund” – Beispiel nehmen wir also “05;31;42″ (05 = blinkender Text; 31 = rote Schrift im Vordergrund und 42 = Hintergrundfarbe grün). Anschließend wird ein “m” angehangen, um die Kontrollstruktur zu beenden und zu signalisieren “Jetzt kommt mein Text!”. Bisher haben wir also: “^[[05;31;42m”
Als kleines Beispiel schreibe ich nun einfach “Ich bin haesslicher, blinkender Text auf einem unmoeglichen Hintergrund!” direkt hinter das “m”. Dieser Text soll also gleich in unserer sehr eigenwilligen Farbkonstellation ausgegeben werden.
Genau wie die Escapesequenz eingeleitet und aktiviert wurde, muss sie nun auch wieder beendet werden um normalen Text schreiben zu können. Sonst hätte man am Ende ja nur eine große, blinkende, häßliche Textdatei, und das wollen wir wohl nicht ![]()
Hierzu bedienen wir uns wieder der Tastenkombination STRG-v, “Pfeiltaste-nach-rechts” – Taste und dem löschen der Zeichen “OC”. Als nächstes folgt noch ein “[0m”. Die 0 setzt den Text wieder auf seine Standardeigenschaften zurück.
Zur Überprüfung schreibe ich in diesem Beispiel noch den Text “Puh, endlich ist der Albtraum vorbei!” dahinter.
So, dann bewundern wir mal unser Werk: Abspeichern, vim verlassen und “cat Dateiname” eingeben.
Ich bin mir seeeeeehr sicher, das dieses HowTo vor inhaltlichen und fachlichen Ungenauigkeiten nur so strotzt. Ich habe jedoch bisher keine bessere Anleitung gefunden. Wer Fehler findet, kann mich gerne durch einen Kommentar korrigieren
Syntax Highlighting im vim aktivieren
Nur ein schneller Tipp für zwischendurch.
Unter Debian und Debian-artigen Linux Distributionen ist das Syntax Highlighting standardmäßig deaktiviert. Ist auch gut so für ein Serverbetriebssystem, da manche KVM Displays auf Farben nicht so gut zu sprechen sind.
Meistens ist dieses jedoch ein Feature, das einen ungemein bei der Arbeit unterstützt.
In diesem Blog, der leider nur von registrierten Usern Kommentare akzeptiert ( was mir aber zu umständlich ist
), habe ich schnell gefunden, wie man es aktiviert:
Einfach in die Datei “/etc/vim/vimrc” die Option “syntax on” setzen. Bei Debian und Ubuntu existiert der Eintrag bereits, ist jedoch durch doppelte Anführungszeichen auskommentiert.
Das war’s schon!
Beim nächsten Start von vim ist das Syntax Highlighting aktiviert.
Achtung: Auf diesem Wege gillt es global für alle User!
Userspezifisch kann man dasselbe erreichen, indem man stattdessen die Datei “.vimrc” im jeweiligen Home-Dir des Users wie oben beschrieben editiert.
USB Transfer unter Suse Linux suuuuper langsam …
Ich hatte heute den Fall auf der Arbeit, das ich auf eine an einem unserer Suse Linux Server angeschlossene USB 2.0 Festplatte mehrere Gibibyte an Daten kopieren musste.
Das dauerte …. und dauerte …. schliesslich fiel mir auf, das die Daten mit nur 160 KB/s kopiert wurden. Das kam mir komisch vor, schliesslich sollten die Datenraten von USB 2.0 doch deutlich höher liegen. In diesem Wiki-Artikel fand ich schliesslich heraus, das es (laut Spezifikation) 480 Mbit/s hätten sein sollen; also ca. 60 MebiByte pro Sekunde.
Das hat mich dann schon sehr gewundert, schliesslich ist das nur ca. 1/384tel Bruchteil der Transferkapazität des Buses.
Eine erste Recherche heute auf der Arbeit förderte diesen Foreneintrag von Dezember 2007 zu Tage, in dem der Hinweis gegeben wird, das dieses Problem verschwindet, wenn die mount-Option “sync” weggelassen wird. Als ich es ebenfalls probiert habe ohne “sync” zu mounten, war es auch schlagartig schneller.
Inzwischen habe ich etwas genauer nachrecherchiert:
Bei dem ganzen handelt es sich um einen zumindest bei Novell (Suse) bekannten Bug (siehe Novell Bugzilla Database #105871). Ob er nun nur bei Suse Linux auftritt oder ob es ein genereller Linux Bug ist, das weiss ich nicht. Und ehrlich gesagt bin ich jetzt auch zu faul den ganzen Bug zu lesen. Wer mag, kann das gerne nachholen.
Unter’m Strich bleibt zumindest für Suse Linux in der Version 10.x folgende Lösung: USB Laufwerke nicht mit der mountoption “sync” mounten!
(Ob andere Suse Linux Versionen oder gar andere Distributionen betroffen sind weiss ich nicht; einfach ausprobieren!).
Für per “subfs” gemountete Dateisysteme gibt es einen weiterführenden Workarround um sicher zu stellen, das diese Dateisysteme nicht mit “sync” gemounted werden:
- mkdir -p /usr/share/hal/fdi/policy/95userpolicy
- Eine Datei namens “nosync.fdi” darin erzeugen (vi /usr/share/hal/fdi/policy/95userpolicy/nosync.fdi) und darin folgenden Inhalt anlegen:
<?xml version=”1.0″ encoding=”UTF-8″?>
<deviceinfo version=”0.2″>
<device>
<!– disable sync for mount –>
<match key=”block.is_volume” bool=”true”>
<match key=”volume.fsusage” string=”filesystem”>
<match key=”volume.uuid” string=”==UUID==”>
<merge key=”volume.policy.mount_option.sync”
type=”bool”>false</merge>
</match>
</match>
</match>
</device>
</deviceinfo> - Ausführen von “lshal“. Die Passage im unter Punkt 2. aufgeführten Text die hier temporär mit “==UUID==” befüllt ist, mit der Ausgabe dieses Befehls ersetzen.
- HAL Daemon neu starten (rhal restart)
Ich hoffe dieses hilft einigen von Euch
Wie immer würde ich mich freuen, wenn ihr einen kurzen Kommentar eintragen würdet!
Achja, wie immer der Hinweis: Wer sich über diese “merkwürdigen” Bezeichnungen wie “MebiByte”, GibiByte”, etc. wundert, dem sein mein Artikel über Binärpräfixe als Lektüre ans Herz gelegt
Apache – Anfragen ohne www. umleiten
Suchmaschinen bewerten eine Seite und deren Inhalt anhand vieler, teilweise dem normalen User garnicht bewusste, Kriterien um den PageRank einer Seite zu bestimmen, bzw. deren Relevanz zu einem Suchbegriff.
So wird es z.B. von Suchmaschinen inzwischen geahndet, wenn ein und derselbe Inhalt über zwei verschiedene Adressen erreichbar ist.
Es ist für eine Suchmaschine bereits ein Unterschied, ob eine Seite ohne www. Subdomain-Präfix (z.B. http://webseite.de ) oder mit www. Subdomain-Präfix (z.B. http://www.webseite.de ) aufgerufen werden kann. Das ist auch soweit korrekt, da in verschiedenen Subdomains ja vollkommen andere Inhalte bereitgestellt werden können. Im weitesten Sinne können sich ja gar vollkommen andere Server hinter jeder Subdomain verbergen. Und www ist letzten endes auch nur eine Subdomain. Aus Sicht der Bewertungslogik einer Suchmaschine, handelt es sich bei einer Domain http://webseite.de und http://www.webseite.de um völlig verschiedene Webseiten.
Man nehme nur mal an das wäre nicht so. Dann könnte sich ja jeder Kinz und Kunz, der nur ein einziges Mal eine HTML Seite mit allen möglichen Suchbegriffen von Abakus bis Zypern hochgeladen hat, beliebig viele (Sub-/)Domains auf diese HTML Seite zeigen lassen, und somit quasi alleine in den Suchergebnissen auftauchen. Somit verdrängen Website-Spammer ja fast alle anderen relevanten Seiten, die ordnungsgemäß nur eine Domain auf ihre Webpräsenz zeigen lassen, völlig aus den Suchergebnissen.
Man kann dieser Herabstufung der eigenen Präsenz jedoch ganz einfach entgegenwirken: Indem man einfach alle Anfragen an http://webseite.de nach http://www.webseite.de umleitet.
Hierzu bietet sich das Apache Modul mod_rewrite an. Es handelt sich hierbei um ein sehr mächtiges Modul, welches bestimmte Adressen zu beliebigen anderen Adressen umformen kann. Es hat dabei seine ganz eigene Syntax um hierfür Regeln zu definieren. Diese ist viel zu mächtig um sie hier auch nur annähernd zu erklären; wen es interessiert, der kann die Anleitung zu diesem Modul hier finden.
An dieser Stelle sei nur erklärt, wie man seinen Apache Webserver dazu bringen kann, die URL ohne www. zu einer Adresse mit www. umzuformen:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^webseite\.de$ [NC]
RewriteRule ^(.*)$ http://www\.webseite\.de$1 [R=301,L]
Dieser Absatz kann per .htaccess Datei, per vHost oder global in der Apache Konfiguration eingefügt werden. Nicht vergessen den Webserver neu zu starten und ausprobieren!
Ich erkläre die drei Zeilen wie gesagt nur ganz grob, da ich keine Lust habe der 1.000. Wiederkäuer der Moduldokumentation zu werden:
Zeile 1:
Hier wird die Rewrite Engine eigentlich nur aktiviert, damit das Modul überhaupt angesteuert werden kann.
Zeile 2:
Mit “RewriteCond” wird das Muster definiert, welches, sofern es in der eingegebenen Adresse vorkommt, nach den Bedingungen der Direktive “RewriteRule” schliesslich umgeformt werden soll. %{HTTP_HOST} ist eine Variable, die vom Modul mod_rewrite zur Laufzeit der Rewrite Engine automatisch erzeugt wird. Sie beinhaltet die in der HTTP-Protokollanfrage angegebenen Hostnamen.
Dadurch das diese Variable an der 1. Position nach ”RewriteCond” steht, wird dieses bei der Anfrage nach dem an der 2. Position stehendem Muster durchsucht.
Das Muster an der 2. Position nach “RewriteCond” ist ein regulärer Ausdruck; eine weitere Technik, die zu erklären hier den Rahmen sprengen würde. Er besagt, das die Zeichenkette in der Variable %{HTTP_HOST} genau “webseite.de” sein muss; ohne ein Zeichen davor und ohne ein Zeichen dahinter. (“/unterseite.html” zum Beispiel ist nicht Teil dieser Veriablen, da es hinter dem “/” steht). Die Zusatzoption [NC] an der 3. Position nach “RewriteCond” bedeutet, das Groß- und Kleinschreibung in der URL egal ist. (NC = Non Casesensitive).
Zeile 3:
Diese Zeile definiert letzten Endes die Regel, nach der die Anfrage modifiziert werden soll. Es handelt sich zunächst wieder um einen regulären Ausdruck, der besagt, das die gesamte Zeichenkette, welche durch “RewriteCond” analysiert wurde, durch “http://www.webseite.de/urspruengliche/anfrage.html” ersetzt werden soll (“/ursprüngliche/anfrage.html” ist selbstverständlich nur ein Beispiel. Hier wird immer eingefügt, was nach der TLD angegeben worden ist). Dabei soll der HTTP Statuscode 301 (Permanent Redirect) in der Antwort versendet werden und dieses ist die letzte Regel ([L]). Danach sollen keine mehr folgen. So werden Endlosschleifen vermieden und der Arbeitsbereich der RewriteEngine klar abgegrenzt.
