{"id":25,"date":"2009-08-11T22:41:09","date_gmt":"2009-08-11T20:41:09","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=25"},"modified":"2016-01-11T22:56:19","modified_gmt":"2016-01-11T21:56:19","slug":"tricks-mit-htaccess","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/tricks-mit-htaccess\/","title":{"rendered":"Tricks mit .htaccess"},"content":{"rendered":"<p><strong>.htaccess<\/strong> &#8211; Dateien sind kleine Webserver-Konfigurationsdateien, die einige sehr n\u00fctzliche Features mitbringen. Auf die meiner Meinung nach n\u00fctzlichsten Tricks und Kniffe mit dieser Datei gehe ich in dieser Kurzabhandlung ein.<\/p>\n<h3>1) .htaccess erstellen<\/h3>\n<div id=\"attachment_27\" style=\"width: 160px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/htaccess-erstellen.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-27\" class=\"size-thumbnail wp-image-27\" title=\"htaccess-erstellen\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/htaccess-erstellen-150x107.jpg\" alt=\"htaccess erstellen\" width=\"150\" height=\"107\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/htaccess-erstellen-150x107.jpg 150w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/htaccess-erstellen-300x215.jpg 300w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/htaccess-erstellen.jpg 828w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a><p id=\"caption-attachment-27\" class=\"wp-caption-text\">htaccess erstellen<\/p><\/div>\n<p>Das erste Problem kommt postwendend: Wie erstellt man eine .htaccess-Datei? Da Windows keine Dateinamen zul\u00e4sst, die mit einem Punkt beginnen, hat man\u00a0<strong>2 M\u00f6glichkeiten<\/strong>: Entweder man erstellt die Datei unter\u00a0<em>htaccess.txt<\/em>, l\u00e4dt sie auf den FTP-Server und benennt sie da erst in\u00a0<em>.htaccess<\/em> um, oder man verwendet einen &#8222;besseren&#8220; Texteditor wie\u00a0<a href=\"http:\/\/notepad-plus.sourceforge.net\/de\/site.htm\">Notepad++<\/a>, erstellt ein neues Dokument und speichert dieses unter\u00a0<em>.htaccess<\/em>, was dann komischerweise auch von Windows toleriert wird.<\/p>\n<h3>2) Was es zu beachten gilt<\/h3>\n<div id=\"attachment_35\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/fehler-500.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-35\" class=\"size-thumbnail wp-image-35\" title=\"fehler-500\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/fehler-500-150x150.jpg\" alt=\"Fehler 500\" width=\"150\" height=\"150\" \/><\/a><p id=\"caption-attachment-35\" class=\"wp-caption-text\">Fehler 500<\/p><\/div>\n<p>.htaccess-Dateien m\u00fcssen zu 100% korrekt geschrieben sein, denn sonst lacht euch ein\u00a0<strong>Fehler 500<\/strong> (siehe rechts) an, der den Seitenzugriff auf den kompletten Server verhindert &#8211; Also vorsichtig sein und lieber erstmal &#8222;lokal&#8220; experimentieren\u00a0<strong>oder<\/strong> die .htaccess in einem Unterverzeichnis ausprobieren. Das bringt uns auch gleich zum n\u00e4chsten Punkt: In der Wurzel erstellte .htaccess-Dateien (<em>also etwa https:\/\/d-mueller.de\/.htaccess<\/em>) haben G\u00fcltigkeit \u00fcber den kompletten Webserver einschlie\u00dflich aller Unterverzeichnisse, wohingegen eine .htaccess in einem Unterordner (<em>also etwa https:\/\/d-mueller.de\/subfolder\/.htaccess<\/em>) nur auf diesen Unterordner und Unterordner dieses Ordners (<em>wie z.B. https:\/\/d-mueller.de\/subfolder\/weitererSubfolder\/<\/em>) hat<\/p>\n<h3>3) Webserver-Ansicht<\/h3>\n<div id=\"attachment_43\" style=\"width: 160px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/dateinamensuebersicht.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-43\" class=\"size-thumbnail wp-image-43\" title=\"Dateinamens\u00fcbersicht\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/dateinamensuebersicht-150x150.jpg\" alt=\"Dateinamens\u00fcbersicht\" width=\"150\" height=\"150\" \/><\/a><p id=\"caption-attachment-43\" class=\"wp-caption-text\">Dateinamens\u00fcbersicht<\/p><\/div>\n<p>Jetzt geht&#8217;s auch schon los: Wenn Ihr ein Verzeichnis per Browser aufruft und keinen Dateinamen angebt (<em>also bspw. https:\/\/d-mueller.de\/verzeichnis\/<\/em>), so wird automatisch nach der\u00a0<strong>index.php<\/strong> oder\u00a0<strong>index.html<\/strong> gesucht. Wenn es diese nicht geben sollte, hei\u00dft es\u00a0<a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/forbidden.jpg\"><strong>Forbidden &#8211; You don&#8217;t have permission to access \/verzeichnis\/ on this server.<\/strong><\/a>. Soll jetzt aber eine Dateiauflistung nach dem Schema des Screenshots auf der linken Seite erscheinen, muss foldender Code in die\u00a0<strong>.htaccess<\/strong><\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nOptions +Indexes\r\nDirectoryIndex index.html\r\n<\/pre>\n<p>Dies wei\u00dft den Webserver dazu an, eine index.html zu erstellen, die alle Dateien in diesem Unterverzeichnis anzeigt.\u00a0<strong>Vorsicht:<\/strong> Wie unter\u00a0<em>2) Was es zu beachten gilt<\/em> erw\u00e4hnt, gilt dies auch f\u00fcr alle Unterordner. Bedenkt, dass solch eine Option beachtliche Sicherherheitsrisiken mit sich bringen kann.<\/p>\n<h3>4) Alternative Fehler-404-Seite<\/h3>\n<div id=\"attachment_46\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/404.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-46\" class=\"size-thumbnail wp-image-46\" title=\"Fehler 404\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/404-150x150.jpg\" alt=\"Fehler 404\" width=\"150\" height=\"150\" \/><\/a><p id=\"caption-attachment-46\" class=\"wp-caption-text\">Fehler 404<\/p><\/div>\n<p>Die Standardseite f\u00fcr nicht gefundene Dateien ist nicht die h\u00fcbscheste\u00a0und\u00a0die\u00a0<strong>&#8222;Absprungrate&#8220;<\/strong> der Besucher d\u00fcrfte wohl nah an 100% liegen. Wenn ihr jetzt allerdings eine eigene Seite erstellt, die interessante News und andere &#8222;Ausweichdokumente&#8220; anbietet, die die Aufmerksamkeit des Besuchers erregen, ist die Chance wesentlich h\u00f6her, keinen Besucher zu verlieren. Bei Webshops beispielsweise w\u00fcrde sich ein &#8222;Diese Artikel k\u00f6nnten Sie interessieren&#8220;-Script anbieten, um die Aufmerksamkeit gleich wieder zu bekommen.\u00a0<strong>Diese Codezeile macht&#8217;s m\u00f6glich:<\/strong><\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nErrorDocument 404 \/fehler404.php\r\n<\/pre>\n<p>So w\u00fcrde der Benutzer nach dem vergeblichen Besuchen von\u00a0<em>https:\/\/d-mueller.de\/gibtsnicht.htm<\/em> auf\u00a0<em>https:\/\/d-mueller.de\/fehler404.php<\/em> weitergeleitet werden &#8211; geht nat\u00fcrlich auch mit Unterverzeichnissen.<\/p>\n<h3>5) PHP Fehler-Einstellungen<\/h3>\n<div id=\"attachment_53\" style=\"width: 160px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/php-errorlog.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-53\" class=\"size-thumbnail wp-image-53\" title=\"php-errorlog\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/php-errorlog-150x150.jpg\" alt=\"PHP Errorlog\" width=\"150\" height=\"150\" \/><\/a><p id=\"caption-attachment-53\" class=\"wp-caption-text\">PHP Errorlog<\/p><\/div>\n<p>PHP kann sehr offenherzig sein und durch gro\u00dfz\u00fcgig detaillierte Fehlermeldungen zwar einerseits dem Admin bei der Fehlersuche merklich unter die Arme greifen, allerdings auch potentiellen St\u00f6renfrieden einen tiefen Einblick in die logischer Struktur der Website geben und damit die Chance f\u00fcr einen <strong>erfolgreichen Angriff<\/strong> erh\u00f6hen.<\/p>\n<p>Mit der Fehlermeldung<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nWarning: mysql_connect()\r\n[function.mysql-connect]: Access denied for user &#039;zugangsName&#039;@&#039;localhost&#039; (using password: YES) in D:\\xampp\\htdocs\\index.php on line 2\r\n<\/pre>\n<p>h\u00e4tte man als &#8222;Interessent&#8220; zumindest schonmal den Name f\u00fcr den Datenbank-Zugriff. Zwar k\u00f6nnte man jetzt per PHP die Ausgabe der Fehlermeldung im Script unterdr\u00fccken, allerdings ist das unsauber, unprofessionell und ihr habt keine Chance zum Debuggen, da ihr vom Fehler ja garnichts mitbekommt. Besser ist da das <strong>komplette Ausschalten<\/strong> der PHP-Fehlermeldungen und das gleichzeitige Erstellen eines <strong>Error-Logs<\/strong>. Folgender .htaccess-Code machts m\u00f6glich:<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nphp_flag display_errors off\r\nphp_flag log_errors on\r\nphp_value track_errors on\r\nphp_value error_log D:\/xampp\/htdocs\/test\/phperr.log\r\n<\/pre>\n<p>Dabei entspricht der in der letzten Zeile angegebene Pfad dem absoluten Pfad zu eurem Server, zu erfahren per <\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&lt;?php phpinfo(); ?&gt;<\/pre>\n<p> und da unter &#8222;open_basedir&#8220; oder per <\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&lt;?php echo $_SERVER[&#039;DOCUMENT_ROOT&#039;]; ?&gt;<\/pre>\n<p>Damit wird eine automatische Logdatei erstellt, die ihr regelm\u00e4\u00dfig einsehen solltet.<\/p>\n<h3>6) Ver\u00e4ndern der PHP-Konfiguration<\/h3>\n<p>Gerade bei Shared-Hostern habt ihr oft keinen Zugriff auf die <strong>php.ini<\/strong>, in der alle Konfigurationsm\u00f6glichkeiten festgeschrieben sind. Wenn euer Hoster kulant ist, habt ihr zwar vielleicht die Chance, dass jemand f\u00fcr euch die gew\u00fcnschten Einstellunegn an der php.ini vornimmt, allerdings gelten diese dann auch immer global f\u00fcr den kompletten Webserver. Gesetzt den Fall, ihr habt verschiedene Web-Projekte, welche jeweils verschiedene Konfigurationen von PHP voraussetzen, ist die .htaccess wieder das mittel zur Wahl:<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nphp_flag magic_quotes_gpc off\r\nphp_flag register_globals off\r\n<\/pre>\n<p>So k\u00f6nnt ihr wieder recht einfach f\u00fcr jedes Subverzeichnis eigene Regeln bestimmen und &#8222;unm\u00f6gliche&#8220; Servereinstellungen korrigieren, wie sie oft der Fall sind.<\/p>\n<h3>7) Zeichensatzoptionen<\/h3>\n<p>Weiterhin ist es m\u00f6glich, den Standard-Zeichensatz f\u00fcr alle Dokumente einer bestimmten Endung zu definieren. Hier nur kurz den Code, eine ausf\u00fchrlichere Beschreibung gibt es im UTF8-Tutorial unter <strong>5) Der Webserver<\/strong><\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nAddCharset utf-8 .css .htm .html .js\r\nphp_value default_charset utf-8\r\n<\/pre>\n<h3>8) Verzeichnisschutz<\/h3>\n<div id=\"attachment_56\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/passworteingabe.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-56\" class=\"size-thumbnail wp-image-56\" title=\"Passworteingabe\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/passworteingabe-150x150.jpg\" alt=\"Passworteingabe\" width=\"150\" height=\"150\" \/><\/a><p id=\"caption-attachment-56\" class=\"wp-caption-text\">Passworteingabe<\/p><\/div>\n<p>Ein recht komplexes Thema, welches ich auch noch kurz anschneiden m\u00f6chte, ist der Verzeichnisschutz mittels .htaccess. Wenn ihr keine Lust auf das Schreiben komplexer Login-Scripte mit PHP habt, nur weil ihr vor\u00fcbergehend ein gesch\u00fctztes Verzeichnis auf eurem Webserver braucht, ist .htaccess mal wieder eure Wahl. Es lassen sich hier ganze Usergruppen definieren, welchen man die Befugnis auf verschiedene Dateien und Ordner gestatten oder verbieten kann. Erstmal etwas <strong>Beispielcode:<\/strong><\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nAuthUserFile \/www\/htdocs\/w009d060\/.htusers\r\nAuthName &quot;geheimer Bereich&quot;\r\nAuthType Basic\r\nSatisfy Any\r\n\r\n&lt;Limit GET POST&gt;\r\n    order deny,allow\r\n    deny from all\r\n    allow from 85.13.131.206\r\n    Require valid-user\r\n&lt;\/Limit&gt;\r\n<\/pre>\n<p><strong>Und nun im Einzelnen:<\/strong><\/p>\n<ol>\n<li><strong>AuthUserFile<\/strong> definiert den absoluten Pfad zur Datei\u00a0<em>.htusers<\/em>, in der die berechtigten User mit ihrem Passwort angegeben sind. Die Syntax dieser Datei ist dabei<em>Benutzername:verschluesseltes Passwort<\/em> &#8211; Einen Generator zum verschl\u00fcsseln der Passw\u00f6rter sowie n\u00e4here Informationen zur\u00a0<strong>Gruppenzugangsberechtigung<\/strong> findet ihr\u00a0<a href=\"http:\/\/de.selfhtml.org\/servercgi\/server\/htaccess.htm#verzeichnisschutz\">bei sefthtml<\/a>. Die tolle Sache mit der\u00a0<em>.htusers<\/em> ist, dass ihr mit dem einmaligen Erstellen und Anlegen dieser Datei in der Wurzel des Webservers bequem mehrere Verzeichnisse sch\u00fctzen k\u00f6nnt, indem ihr die immergleiche\u00a0<em>.htaccess<\/em> in alle zu sch\u00fctzenden Unterordner schiebt. Dies ist sehr n\u00fctzlich, wenn der Zugriff auf die Seite selbst (also\u00a0<em>https:\/\/d-mueller.de<\/em>) gestattet sein soll, der Zugriff auf\u00a0<em>&#8222;private Unterverzeichnisse&#8220;<\/em> wie bspw.\u00a0<em>https:\/\/d-mueller.de\/geheim\/<\/em> nicht gestattet werden soll. In diesem Fall w\u00e4re dann einfach eine\u00a0<em>.htaccess<\/em> nach oben definiertem Schema in alle zu besch\u00fctzenden Unterverzeichnisse zu schieben.<\/li>\n<li><strong>AuthName<\/strong> erscheint in der Passwort-Eingabebox als Name der Seite (<em>siehe Screenshot<\/em>). Dieser Parameter ist optional und wird standardm\u00e4\u00dfig\u00a0<em>byPassword<\/em> genannt, wenn ihr ihn nicht setzt.<\/li>\n<li><strong>AuthType<\/strong> definiert, ob die \u00dcbertragunsart des Usernamens und des Passworts.\u00a0<em>Basic<\/em> ist unverschl\u00fcsselt,\u00a0<em>Digest<\/em> ist verschl\u00fcsselt, macht das ganze aber um einiges komplizierter.<\/li>\n<li><strong>Satisfy<\/strong> gibt an, ob alle geforderten Zugangsbedingungen (per Standard auf\u00a0<strong>All<\/strong>) oder nur eine der Bedingungungen (<strong>Any<\/strong>) erf\u00fcllt sein muss. Zu den Bedingungen dann sp\u00e4ter.<\/li>\n<li><strong>&lt;Limit GET POST&gt;<\/strong> definiert die Beschr\u00e4nkung des Zugriffs f\u00fcr alle Operationen, also\u00a0<strong>Senden<\/strong> an die Seite\u00a0<em>(POST)<\/em> und\u00a0<strong>Empfangen<\/strong> von Informationen von der Seite\u00a0<em>(GET)<\/em>. Eine Alternative zu\u00a0<strong>LIMIT<\/strong> ist das auch sehr n\u00fctzliche\u00a0<strong>FilesMatch<\/strong>, welches nach folgender Syntax den Zugriff auf Dateien per\u00a0<a href=\"http:\/\/de.wikipedia.org\/wiki\/Regul%C3%A4rer_Ausdruck\">Regular Expression<\/a> genehmigt und verbietet. <strong>Beispielsyntax:<\/strong>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">&lt;FilesMatch\u00a0&quot;^file.(css|php)$&quot;&gt;\u00a0&lt;\/FilesMatch&gt;<\/pre>\n<p> (statt\u00a0<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">&lt;Limit\u00a0GET\u00a0POST&gt;\u00a0[...]\u00a0&lt;\/Limit&gt;<\/pre>\n<p>) w\u00fcrde als Filter nicht den Zugriff auf\u00a0<strong>ALLE<\/strong> Dateien, sondern nur den Zugriff auf die Dateien\u00a0<em>file.php<\/em> sowie\u00a0<em>file.css<\/em> mit den eingeschlossenen Angaben regulieren. Detailliertere Konfigurationsm\u00f6glichkeiten f\u00fcr den doch sehr m\u00e4chtigen\u00a0<em>FilesMatch<\/em>-Parameter gibt es\u00a0<a href=\"http:\/\/www.askapache.com\/htaccess\/using-filesmatch-and-files-in-htaccess.html\">hier<\/a>.<\/li>\n<li><strong>order deny,allow<\/strong> gibt die Reihenfolge der Abarbeitung von Erlaubnis und Verbot an. In der Reihenfolge\u00a0<em>deny,allow<\/em> wird erstmal pauschal alles verboten,\u00a0<strong>es sei denn<\/strong> die nachfolgenden Bedingungen werden alle (<strong>Satisfy All<\/strong>) oder zumindest eine (<strong>Satisfy Any<\/strong>) erf\u00fcllt. In der Reihenfolge\u00a0<em>allow,deny<\/em> wird pauschal erstmal der Zugriff erstmal erlaubt,<strong>es sei denn<\/strong> die nachfolgenden Bedingungen werden nicht erf\u00fcllt (siehe wieder\u00a0<strong>Satisfy<\/strong>). Zu diesem Bedinungen im n\u00e4chsten Punkt.<\/li>\n<li><strong>allow from<\/strong> erm\u00f6glicht die Eingabe einer IP-Adresse, von der aus der Zugriff immer gestattet ist. Beachtet hierbei jedoch, dass die IP normalerweise bei jeder neuen Verbindung ins Internet eine andere ist.<\/li>\n<li><strong>Require valid-user<\/strong> besagt, dass eine g\u00fcltige Kombination aus Passwort und Benutzername aus der\u00a0<em>.htusers<\/em> angegeben muss, um den Zugriff zu gestatten. Alternativ lassen sich hier auch durch Leerzeichen getrennt berechtigte User aus der .htusers angeben, wenn z.B. nicht jeder User der in der .htusers angegeben ist, Zugriff erhalten soll.\u00a0<strong>Beispiel:<\/strong> <em>Require stefan david paula<\/em><\/li>\n<\/ol>\n<p>Wer genau hat also mit dem obigen Beispielcode Zugriff auf die Seite? Es ist ja\u00a0<strong>Satisfy Any<\/strong> gesetzt, also muss nur eine der beiden geforderten Bedingungen (<em>entweder<\/em> ist die IP des Besuchers korrekt\u00a0<em>oder<\/em> der Besucher gibt ein g\u00fcltiges Passwort ein) zutreffen, um Zugang zu erhalten. W\u00e4re jetzt hier\u00a0<strong>Satisfy All<\/strong> gefordert, w\u00fcrde eine\u00a0<em>Und-Verkn\u00fcpfung<\/em> greifen und der Zugriffswillige m\u00fcsste die korrekte IP\u00a0<strong>und<\/strong> ein korrektes Passwort eingeben &#8211; doppelt gemoppelt quasi ;).<\/p>\n<h3>9) Weiterleitungen<\/h3>\n<p>Ein weiteres gro\u00dfes Einsatzgebiet f\u00fcr\u00a0<em>.htaccess<\/em>-Dateien ist die Weiterleitung (Stichwort:\u00a0<a href=\"http:\/\/www.modrewrite.de\/\">mod rewrite<\/a>). Ein paar sinnvolle, n\u00fctzliche Anwendungsbeispiele werde ich hier aufz\u00e4hlen.<\/p>\n<h4>Ganze Website umleiten<\/h4>\n<p>Wenn ihr mehrere Domains verschiedener Schreibweise habt (also bspw.\u00a0<em>http:\/\/www.mein-name.de<\/em> und\u00a0<em>http:\/\/www.meinname.de<\/em>), bietet es sich an, die eine auf die andere weiterleiten zu lassen. Dies mit PHP-Codes wie etwa<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n&lt;?php header(&quot;Location: http:\/\/www.meinname.de\/&quot;); ?&gt;\r\n<\/pre>\n<p>oder Meta-Weiterleitungen wie<\/p>\n<pre data-enlighter-language=\"html\" class=\"EnlighterJSRAW\">\r\n&lt;meta http-equiv=&quot;refresh&quot; content=&quot;0;url=http:\/\/www.meinname.de\/&quot;&gt;\r\n<\/pre>\n<p>zu realisieren, ist immer aufwendig und google k\u00f6nnte in der Bewertung und Indizierung der Seite auch etwas dagegen haben. Deswegen empfiehlt sich eine Umleitung per .htaccess. <strong>Syntax<\/strong><em>:<\/em><\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nRedirect \/ http:\/\/www.meinname.de\/\r\n<\/pre>\n<p>Dieser Code leitet alle Anfragen an die neue Domain weiter, sodass <em>http:\/\/www.mein-name.de\/unterordner\/datei.htm<\/em> elegant auf <em>http:\/\/www.meinname.de\/unterordner\/datei.htm<\/em> verweist.<\/p>\n<h4>Doppelten Content vermeiden<\/h4>\n<p>Google hat ebenfalls etwas gegen doppelten Inhalt einzuwenden, also wenn eure Domain (wie das meistens der Fall ist) unter\u00a0<em>http:\/\/<strong>www.<\/strong>euername.de<\/em> <strong>und<\/strong> <em>http:\/\/euername.de<\/em> zu erreichen ist, existiert die Seite quasi 2mal, was die Bedeutung der Seite im Google-Index evtl. herabsetzt. Um eure Seite nur auf eine Art und Weise aufrufen zu k\u00f6nnen, hilft ein htaccess-Schnippsel wieder weiter. Diesmal bedienen wir uns des oben angesprochenen Plugins\u00a0<em>mod rewrite<\/em>, welches auf dem Gro\u00dfteil der Server bereits vorinstalliert ist. Falls ihr nicht sicher seid, steht\u00a0<a href=\"http:\/\/www.wallpaperama.com\/forums\/how-to-test-check-if-mod-rewrite-is-enabled-t40.html\">hier<\/a>, wie man testet, ob mod rewrite an ist oder nicht.<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nRewriteEngine On \r\nRewriteCond %{HTTP_Host} ^d-mueller\\.de$ [NC] \r\nRewriteRule ^(.*)$ https:\/\/d-mueller.de\/$1 [R=301,L] \r\n<\/pre>\n<p>Damit landen alle Anfragen (ob nun mit\u00a0<strong>www.<\/strong> oder ohne) bei der\u00a0<em>www-Variante<\/em> der Domain. Gleichzeitig wird der Statuscode\u00a0<strong>301<\/strong> gesetzt, was soviel wie\u00a0<em>moved permanently<\/em>bedeutet.<\/p>\n<h4>weiteres Mod-Rewrite Beispiel<\/h4>\n<p>Der Vollst\u00e4ndigkeit halber sei noch ein Weiterleitungs-Beispiel mit mod rewrite angebracht, welches &#8222;statische&#8220; URL&#8217;s suggeriert, obwohl im Hintergrund ein PHP-Script arbeitet. Die Bedeutung von statischen URL&#8217;s ist bei google h\u00f6her gewichtet, au\u00dferdem gibt man einen weniger tiefen Einblick in die Dateistruktur der Website und die URL&#8217;s sind leichter zu merken.<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nRewriteEngine On \r\nRewriteBase \/meineWebanwendung\/ \r\nRewriteRule ^profil\/([0-9]+)\/$ showUserProfile.php?userid=$1 \r\n<\/pre>\n<p>Die\u00a0<strong>RewriteBase<\/strong> definiert das Unterverzeichnis auf dem Server, f\u00fcr das die Regel gilt. Ob die\u00a0<em>.htaccess<\/em> in der Wurzel oder im Unterverzeichnis selbst liegt, ist hierbei unbedeutend, die .htaccess k\u00f6nnte also im Unterordner\u00a0<em>\/meineWebanwendung\/<\/em> oder in der Wurzel selbst liegen. Erreicht wird eine Weiterleitung von <em>http:\/\/www.domain.com\/meineWebanwendung\/profil\/3\/<\/em> auf\u00a0<em>http:\/\/www.domain.com\/meineWebanwendung\/showUserProfile.php?userid=3<\/em>. So kann wird also im &#8222;Hintergrund&#8220; konventionell die verarbeitende .php-Datei angesteuert, obwohl der Benutzer o.g. &#8222;wohlgeformte&#8220; URL besucht. Die\u00a0<em>Wildcard<\/em> ist hierbei auf Zahlen beschr\u00e4nkt, sodass nur Zahlen in der URL zu beschriebener Weiterleitung f\u00fchren. Weitere Anwendungsbeispiele f\u00fcr mod rewrite gibt es\u00a0<a href=\"http:\/\/www.modrewrite.de\/mod_rewrite.examples.beispiele.phtml\">hier<\/a>.<\/p>\n<h3>Ende<\/h3>\n<p>Abschlie\u00dfend sei darauf hingewiesen, dass sich alle hier aufgef\u00fchrten\u00a0<em>htaccess-Konfigurationsm\u00f6glichkeiten<\/em> beliebig miteinander kombinieren lassen. Bei Kritik und Anmerkungen zu diesem kurzen Abriss bitte ich um eine\u00a0<a rel=\"noreferrer\" href=\"mailto:mueller.dav@gmail.com\" target=\"_blank\">e-Mail<\/a>. Weiterf\u00fchrende Links, die zu den einzelnen Themen mehr in die Tiefe gehen und sich auch mit dem Thema\u00a0<em>.htaccess<\/em> und\u00a0<em>Weiterleitung<\/em>besch\u00e4ftigen, sind<\/p>\n<ol>\n<li><a href=\"http:\/\/www.corz.org\/serv\/tricks\/htaccess.php\">http:\/\/www.corz.org\/serv\/tricks\/htaccess.php<\/a><\/li>\n<li><a href=\"http:\/\/wwwuser.gwdg.de\/~mreiman1\/wwwserver\/htaccess-gwdg.html\">http:\/\/wwwuser.gwdg.de\/~mreiman1\/wwwserver\/htaccess-gwdg.html<\/a><\/li>\n<li><a href=\"http:\/\/www.jendryschik.de\/wsdev\/weiterleitung\/\">http:\/\/www.jendryschik.de\/wsdev\/weiterleitung\/<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>.htaccess &#8211; Dateien sind kleine Webserver-Konfigurationsdateien, die einige sehr n\u00fctzliche Features mitbringen. Auf die meiner Meinung nach n\u00fctzlichsten Tricks und Kniffe mit dieser Datei gehe ich in dieser Kurzabhandlung ein. 1) .htaccess erstellen Das erste Problem kommt postwendend: Wie erstellt &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/tricks-mit-htaccess\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,10,6,3],"tags":[],"class_list":["post-25","post","type-post","status-publish","format-standard","hentry","category-php","category-performance","category-security","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/25","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=25"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/25\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=25"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=25"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=25"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}