<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>PHP on Natenoms Blog</title><link>https://natenom.de/tags/php/</link><description>Recent content in PHP on Natenoms Blog</description><generator>Hugo -- gohugo.io</generator><language>de</language><copyright/><lastBuildDate>Fri, 25 Mar 2022 17:08:49 +0100</lastBuildDate><atom:link href="https://natenom.de/tags/php/index.xml" rel="self" type="application/rss+xml"/><item><title>DokuWiki in statische Website umwandeln</title><link>https://natenom.de/2022/03/dokuwiki-in-statische-website-umwandeln/</link><pubDate>Fri, 25 Mar 2022 17:08:49 +0100</pubDate><guid>https://natenom.de/2022/03/dokuwiki-in-statische-website-umwandeln/</guid><description>Nach circa 12 Jahren habe ich mein gern genutztes DokuWiki auf wikiarchiv.natenom.de in den Ruhestand geschickt. Bereits zuvor hatte ich fast alle Themenbereiche in mein neues Wiki auf wiki.natenom.de verschoben.
Ziel war es, nur noch Webseiten zu haben, die statisch sind. D. h. sie werden nicht mehr auf einem Server mit PHP dynamisch erstellt sondern Zuhause einmalig vorgebaut, hochgeladen und dann bekommt jeder Benutzer immer die selben Dateien.
Dadurch benötigt man weder eine Scriptsprache auf dem Server noch eine Datenank (was DokuWiki aber auch so nicht benötigt, da es mit Text-Dateien statt einer Datenbank arbeitet).</description><content:encoded><![CDATA[<p>Nach circa 12 Jahren habe ich mein gern genutztes DokuWiki auf <a  href="https://wikiarchiv.natenom.de/">wikiarchiv.natenom.de</a> in den Ruhestand geschickt. Bereits zuvor hatte ich fast alle Themenbereiche in mein neues Wiki auf <a  href="https://wiki.natenom.de/">wiki.natenom.de</a> verschoben.</p>
<p>Ziel war es, nur noch Webseiten zu haben, die statisch sind. D. h. sie werden nicht mehr auf einem Server mit PHP dynamisch erstellt sondern Zuhause einmalig vorgebaut, hochgeladen und dann bekommt jeder Benutzer immer die selben Dateien.</p>
<p>Dadurch benötigt man weder eine Scriptsprache auf dem Server noch eine Datenank (was DokuWiki aber auch so nicht benötigt, da es mit Text-Dateien statt einer Datenbank arbeitet).</p>
<p>Hier beschreibe ich alle notwendigen Schritte, um aus einem aktuellen DokuWiki eine statische Website zu erstellen, die man dann sorglos auf jeden Webspace werfen kann.</p>
<p>Das Werkzeug meiner Wahl ist <code>wget</code>, mit dem man ganze Websites oder Teile davon herunterladen kann. Dieses habe ich schon in der Vergangenheit genutzt, um mein altes <a  href="https://natenom.de/2017/10/wie-man-ein-dynamisches-mediawiki-in-eine-statische-webseite-nur-html-dateien-umwandeln-kann/">MediaWiki in den Ruhestand zu schicken</a>.</p>

<h2 id="ziel-eines-archivierten-wikis" data-numberify>Ziel eines archivierten Wikis<a class="anchor ms-1" href="#ziel-eines-archivierten-wikis"></a></h2>
<p>Ich wollte den aktuellen Zustand des Wikis komplett mit allen Themenbereichen in einem Paket haben. Auch mit den Themenbereichen, die bereits im neuen Wiki enthalten sind. Damit die Informationen nicht doppelt vorhanden sind, sollten Weiterleitungen eingerichtet werden, sodass man beim &ldquo;Öffnen/Anklicken&rdquo; solcher Themenbereiche automatisch im neuen Wiki landet.</p>
<p>Das hat unter anderem den Hintergrund, dass man sehr einfach noch an die umgezogenen Themenbereiche dran kommt. Hätte ich sie im Wiki gelöscht, wären sie auch nicht mehr in der Sidebar links zu sehen.</p>
<p>Zudem besteht so die Möglichkeit, dass man das komplette archivierte Wiki weitergeben kann oder lokal zur Verfügung stellen. Als Archiv halt.</p>

<h2 id="vorbereitungen-am-wiki-vor-dem-herunterladen-mit-wget" data-numberify>Vorbereitungen am Wiki vor dem Herunterladen mit wget<a class="anchor ms-1" href="#vorbereitungen-am-wiki-vor-dem-herunterladen-mit-wget"></a></h2>
<p>Damit später im archivierten Wiki möglichst selten 404-Fehlermeldungn erscheinen, habe ich alles deatkviert, was man nicht benötigt und/oder was ohne PHP nicht mehr funktionieren würde.</p>

<h3 id="deaktivierte-aktionen-von-dokuwiki" data-numberify>Deaktivierte &lsquo;Aktionen&rsquo; von DokuWiki<a class="anchor ms-1" href="#deaktivierte-aktionen-von-dokuwiki"></a></h3>
<p>In der Konfiguration von DokuWiki ist es möglich, bestimmte <a  class='urlextern'  href="http://www.dokuwiki.org/config:disableactions">Aktionen</a> zu deaktivieren. Einige davon waren bereits zuvor deaktiviert, ich habe dann noch alle anderen deaktiviert:</p>
<ul>
<li>Übersicht</li>
<li>&ldquo;Letzte Änderungen&rdquo;</li>
<li>&ldquo;Links hierher&rdquo;</li>
<li>&ldquo;Benutzerprofil&rdquo;</li>
<li>&ldquo;Suche&rdquo;, da sie PHP benötigt.</li>
<li>&ldquo;Setze neues Passwort&rdquo;.</li>
<li>&ldquo;Diese Seite bearbeiten&rdquo;</li>
<li>Medien-Manager – Bei &ldquo;Andere Aktionen (durch Komma getrennt)&rdquo; <code>media</code> eingeben. Beim Aufruf von <code>/start?do=media&amp;ns=</code> erscheint die Fehlermeldung <code>Action disabled: media</code>. Das hätte ich schon vor Jahren machen können, hätte ich es gewusst. Denn das war ein Bereich, der dauernd von Bots abgefragt wurde.</li>
</ul>
<p></p><figure class="image-caption"><a href="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions.png"><picture>
                <source type="image/webp" srcset="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-dokuwiki-disabled-actions_hu1f78d8c8ed8ee2ef5020f56f1760ff51_37339_816x0_resize_q95_h2_catmullrom_3.webp" title="Disabled actions in DokuWiki" loading="lazy" width="816" height="152" /></picture></a><figcaption>Disabled actions in DokuWiki</figcaption></figure><p>
</p>

<h2 id="indexmenü-ohne-javascript" data-numberify>Indexmenü ohne Javascript<a class="anchor ms-1" href="#indexmenü-ohne-javascript"></a></h2>
<p>Ich habe das Indexmenu für die Sidebar (links) (Seitenname <code>/wiki/sidebar</code>) auf <code>nojs</code> umgestellt, damit kein JavaScript verwendet wird. Aus <code>{{indexmenu&gt;..#1|js#indextheme navbar tsort nsort notoc noscroll nocookie}}</code> wird <code>{{indexmenu&gt;..#1|nojs#indextheme navbar tsort nsort notoc}}</code>. Die Dokumentation dazu <a  class='urlextern'  href="https://www.dokuwiki.org/plugin:indexmenu#full_syntax">gibt es hier</a>.</p>
<p>Die Liste der obersten Ebenen reicht in der Sidebar völlig aus, denn in jedem Namensraum ist am Ender der Startseite schon ein Indexmenü eingefügt, sodass man auf alle Seiten dort zugreifen kann. Zudem wird die Sidebar geöffnet dargestellt, sobald man sich auf einer Seite in einem der Unterbereiche befindet.</p>
<div class="shortcode-notice hinweis">
    <div class="shortcode-notice-title hinweis">
        Hinweis</div>
    <div class="notice-content">Ich habe getestet, wie es aussieht, wenn ich zumindest den kompletten Seitenbaum für die Bereiche Mumble und Minecraft immer geöffnet lasse. Dann ist das Wiki auf mobilien Geräten nicht mehr zu gebrauchen, da die Liste aller Seiten extrem lang ist. Schon meine Mumble-Dokumentation besteht aus ca. 330 Seiten.</div>
</div>

<h3 id="weitere-änderungen" data-numberify>Weitere Änderungen<a class="anchor ms-1" href="#weitere-änderungen"></a></h3>
<ul>
<li>DokuWiki-eigene Topbar-Seite gelöscht.</li>
<li>Translation Plugin deaktiviert, da es sonst Links gibt auf z. B. <code>start?id=linux/pulseaudio</code>. Das wäre dann komplizierter geworden mit den ganzen Weiterleitungen (siehe unten) und es sind nur ein paar wenige Seiten in englischer Sprache in meinem Wiki (die ich später ins neue verschieben werde).</li>
<li>Alle Benutzer außer Admin gelöscht</li>
<li>Die Seite <code>/wiki/syntax</code> gelöscht. Die ist in jedem DokuWiki &ldquo;vorinstalliert&rdquo;.</li>
<li>Namensraum <code>en</code> (English) aus dem Indexmenu ausgeschlossen.</li>
<li>Startseite angepasst mit der Information, dass das Wiki archiviert wurde und nun statisch ist.</li>
</ul>

<h2 id="es-geht-los--wiki-mit-wget-herunterladen" data-numberify>Es geht los – Wiki mit wget herunterladen<a class="anchor ms-1" href="#es-geht-los--wiki-mit-wget-herunterladen"></a></h2>
<p>Während des Herunterladens habe ich <a  href="/2022/03/umzug-dokuwiki-hugo-4-einrichtung-fertig/#weiterleitungen">sämtliche Weiterleitungen auf das neue Wiki</a> temporär deaktiviert. Denn ich wollte das gesamte alte Wiki haben und nicht schon teiweise das neue.</p>
<p>Der Aufruf von wget zum Herunterladen des Wikis:</p>
<pre><code>wget --recursive --no-clobber --page-requisites --html-extension --convert-links --restrict-file-names=unix --no-parent --reject-regex 'do=' --domains wiki.natenom.de https://wiki.natenom.de
</code></pre>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content"><p>Wenn es Probleme gibt und eine Meldung in der Form <code>no follow attribute found</code>, dann benötigt man zusätzlich noch diesen Parameter:</p>
<pre><code>-erobots=off
</code></pre>
</div>
</div>


<p>Ich habe das direkt auf dem Server ausgeführt, auf dem das Wiki läuft. Es hat circa 2 Minuten gedauert.</p>
<p>Die Befehlszeile habe ich von <a  class='urlextern'  href="https://gist.github.com/thomaspoignant/7cbae830acefb923e9d3fd373420f2f5">hier</a> und die war <a  class='urlextern'  href="https://www.tiktaktux.de/doku.php?id=linux:dokuwiki_mit_wget_export">hier</a> verlinkt.</p>
<p>Zusätzlich habe ich noch die Sitemap heruntergeladen, die mit oberem Befehl nicht heruntergeladen wird:</p>
<pre><code>wget https://wiki.natenom.de/sitemap.xml.gz
</code></pre>

<h3 id="wieso-weshalb-warum" data-numberify>Wieso, weshalb, warum<a class="anchor ms-1" href="#wieso-weshalb-warum"></a></h3>
<ul>
<li>Man könnte <code>--reject-regex</code> noch erweitern mit <code>'do=|feed.php'</code>. Ich möchte aber alle Feeds behalten, denn so kann man sehen, wenn man diese abonniert hat, dass es im Wiki nicht weiter geht. Und Programme und Suchmaschinen mögen es generell nicht, wenn Dateien plötzlich verschwinden. Dann lieber lassen und nichts neues eintragen.</li>
<li>Dass URLs mit dem Parameter <code>?do=</code> gefiltert werden, ist sinnvoll, weil man sonst zu jeder html-Datei noch einige weitere <code>abc.html?do=def</code> erhält. Z. B. für die Anmeldung, den Medien-Manager und einiges mehr. Hier der Unterschied zwischen einem Download mit wget mit <code>--reject-regex 'do='</code> (links) und ohne (rechts): </p><figure class="image-caption"><picture><source type="png" srcset="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-midnight-commander-je-nach-parameter.png" />
			         <img alt="" src="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-22-screenshot-midnight-commander-je-nach-parameter.png" title="Links mit do= und rechts ohne" width="726" height="592" loading="lazy" /></picture><figcaption>Links mit do= und rechts ohne</figcaption></figure><p>
</li>
</ul>

<h2 id="dokuwiki-durch-statische-website-ersetzen" data-numberify>DokuWiki durch statische Website ersetzen<a class="anchor ms-1" href="#dokuwiki-durch-statische-website-ersetzen"></a></h2>
<p>Dann war der Zeitpunkt gekommen, das noch laufende DokuWiki durch das heruntergeladene archivierte Wiki zu ersetzen.</p>
<p>Das eine fliegt aus dem Webserver-Verzeichnis raus, das andere kommt rein. Dazu habe ich dann noch die zuvor heruntergeladene Sitemap hineinkopiert.</p>
<p>Backups sind immer wichtig, falls man doch noch mal an irgendwelche Dinge dran müsste.</p>

<h2 id="nacharbeiten-in-der-konfiguration-des-webservers" data-numberify>Nacharbeiten in der Konfiguration des Webservers<a class="anchor ms-1" href="#nacharbeiten-in-der-konfiguration-des-webservers"></a></h2>
<p>Die Konfiguration des Webservers kann man nach dem Umzug deutlich vereinfachen, da nur noch das ausgeliefert wird, was auf dem Server liegt, ohne von PHP verarbeitet werden zu müssen. Darauf gehe ich hier nicht ein sondern werde nur ein paar Dinge nennen, die man ändern muss.</p>

<h3 id="mime-types-wegen-cache-anhang-in-dateinamen" data-numberify>Mime Types wegen &lsquo;Cache&rsquo;-Anhang in Dateinamen<a class="anchor ms-1" href="#mime-types-wegen-cache-anhang-in-dateinamen"></a></h3>
<p>Da ein Dokuwiki einen Cachingmechanismus hat, werden einie Dateien, z. B. Bilder, je nach Art der Einbindung, mit <code>?cache=</code> am Ende referenziert und beim Herunterladen entsprechend von wget benannt. Z. B. wird aus <code>/url/zu/bild.jpg</code> <code>/url/zu/bild.jpg?cache=</code>.</p>
<p>Klickt man auf eine solch referenzierte Datei, dann bietet der Webserver diese zum Download an, statt sie im Browser anzuzeigen. Das liegt daran, dass der Webserver nichts mit dieser &ldquo;Dateiendung&rdquo; anfangen kann.</p>
<p>Deshalb muss man dem Webserver mitteilen, was sich hinter diesen Endungen verbirgt. Das geht mit der folgenden Konfiguration: <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span>    <span style="color:#66d9ef">location</span> ~ <span style="color:#e6db74">\.jpg\?cache=</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">types</span> { }
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">default_type</span> <span style="color:#e6db74">image/jpeg</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">location</span> ~ <span style="color:#e6db74">\.png\?cache=</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">types</span> { }
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">default_type</span> <span style="color:#e6db74">image/png</span>;
</span></span><span style="display:flex;"><span>    }</span></span></code></pre></div>

<h3 id="jetzt-zusätzlich-auch-auch-html-am-ende-achten" data-numberify>Jetzt zusätzlich Auch auch .html am Ende achten<a class="anchor ms-1" href="#jetzt-zusätzlich-auch-auch-html-am-ende-achten"></a></h3>
<p>Die mit wget heruntergeladenen Dateien haben alle eine .html-Dateierweiterung bekommen. D. h. aus der vorherigen URL <code>/android/</code> wurde <code>/android.html</code>.</p>
<p>Damit aber z. B. Links von extern noch richtig funkionieren, die ja auf <code>/android/</code> verweisen, muss der Webserver angewiesen werden nicht nur auf <code>/android/</code> zu prüfen, sondern auch auf <code>/android.html</code> und dann das Gefundene nutzen. Daher muss das in die config für das alte Wiki (wiki.natenom.de) das hier hinein:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span>    <span style="color:#66d9ef">location</span> <span style="color:#e6db74">/</span> <span style="color:#e6db74">...</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">try_files</span> $uri $uri.html $uri/ =<span style="color:#ae81ff">404</span>;</span></span></code></pre></div></p>
<p>Der Webserver prüft also auf <code>android</code>, <code>android.html</code> und <code>/android/</code> und gibt erst 404 zurück, wenn nichts davon gefunden wird.</p>

<h3 id="weiterleitungen-mit-html-auch-am-ziel-beachten" data-numberify>Weiterleitungen mit .html auch am Ziel beachten<a class="anchor ms-1" href="#weiterleitungen-mit-html-auch-am-ziel-beachten"></a></h3>
<p>Da viele Inhalte meines alten Wikis schon in meinem neuen Wiki (wiki.natenom.com) enhalten sind und ensprechend verlinkt werden, musste ich auch dort noch die Konfiguration des Webservers anpassen.</p>
<p>Ich leite nach folgendem Muster von meinem alten Wiki ins neue Wiki weiter:</p>
<p><code>rewrite ^/android(.*)$ https://wiki.natenom.de/docs/android$1 redirect;</code></p>
<p>Das bedeutet, dass z. B. ein weitergeleitetes <code>https://wiki.natenom.de/android</code> im neuen Wiki <code>wiki.natenom.com/</code> sowohl in der Form <code>/android</code> als auch in der Form <code>/android.html</code> ankommen kann. Damit letztere Form im neuen Wiki keine 404 verursacht, kann man den Webserver anweisen, die Dateiendung immer zu entfernen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span>    <span style="color:#66d9ef">location</span> <span style="color:#e6db74">/</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">if</span> <span style="color:#e6db74">(</span>$request_uri ~ <span style="color:#e6db74">^/(.*)\.html)</span> {
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">return</span> <span style="color:#ae81ff">302</span> <span style="color:#e6db74">/</span>$1;
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    }</span></span></code></pre></div>
<p>Somit landen alle Formen der Weiterleitung am richtigen Ziel:</p>
<ul>
<li><code>/android</code> -&gt; <code>wiki.natenom.com/android</code></li>
<li><code>/android.html -&gt; wiki.natenom.com/android</code>.</li>
</ul>

<h2 id="aufräumarbeiten" data-numberify>Aufräumarbeiten<a class="anchor ms-1" href="#aufräumarbeiten"></a></h2>
<p>Dafür habe ich in den letzten Wochen und Monaten immer wieder sehr viel Arbeit investiert. Und nun war es endich soweit. Alle meine Webseiten waren statisch und so konnte ich (nachdem ich schon vor Monaten MySQL deinstallieren konnte, weil der Blog statisch wurde) endlich auch PHP von meinem Server deinstallieren:</p>
<pre><code>systemctl stop php7.3-fpm
systemctl disable php7.3-fpm

apt remove --purge php*

php php-common php-fpm php-gd php-imagick php-mbstring php-sqlite3 php-xml php-zip php7.3 php7.3-cli php7.3-common php7.3-curl php7.3-fpm php7.3-gd php7.3-json php7.3-mbstring php7.3-opcache php7.3-readline php7.3-sqlite3 php7.3-xml php7.3-zip
</code></pre>
<p>Fertig 🙂</p>
<p>Hier das Ergebnis: Mein archiviertes Wiki, das jetzt auf <a  href="https://wikiarchiv.natenom.de/">wiki.natenom.de</a> liegt.</p>
<p></p><figure class="image-caption"><a href="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de.png"><picture>
                <source type="image/webp" srcset="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/03/dokuwiki-in-statische-website-umwandeln/images/2022-03-25-screenshot-archiviertes-wiki.natenom.de_huce9b66e96165192ba69208117d9383a6_243439_816x0_resize_q95_h2_catmullrom_3.webp" title="" loading="lazy" width="816" height="634" /></picture></a><figcaption></figcaption></figure><p>
</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Für weitere Dateitypen beliebig erweiterbar.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded><enclosure url="https://natenom.de/2022/03/dokuwiki-in-statische-website-umwandeln/cover.png" length="243439" type="image/png"/></item><item><title>Umzug von WordPress zu Hugo – Teil 2 – Bestandsaufnahme und Korrekturen</title><link>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/</link><pubDate>Thu, 03 Feb 2022 10:10:33 +0100</pubDate><guid>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/</guid><description>Im ersten Teil ging um die Gründe meines Wechsels von WordPres zu Hugo und wie man den Wechsel technisch umsetzt und am Ende einen lauffähigen Blog mit Hugo hat, dem man im Browser lokal anschauen kann.
Hier im zweiten Teil geht es darum, für die Übergangszeit das übrig gebliebene HTML, das nicht zu Markdown konvertiert werden konnte, automatisiert so zu verändern, dass der Blog trotzdem ansehnlich ist, wenn auch noch nicht perfekt.</description><content:encoded><![CDATA[<p>Im <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/">ersten Teil</a> ging um die Gründe meines Wechsels von WordPres zu Hugo und wie man den Wechsel technisch umsetzt und am Ende einen lauffähigen Blog mit Hugo hat, dem man im Browser lokal anschauen kann.</p>
<p>Hier im zweiten Teil geht es darum, für die Übergangszeit das übrig gebliebene HTML, das nicht zu Markdown konvertiert werden konnte, automatisiert so zu verändern, dass der Blog trotzdem ansehnlich ist, wenn auch noch nicht perfekt. Das hat den Vorteil, dass ich den Blog mit Hugo bereits aktiv nutzen kann und nicht im Hintergrund erst alles auf manuell auf Markdown umstellen musste.</p>
<p>Es wird nicht ganz so viel werden, wie im ersten Teil.</p>

<h2 id="übrig-gebliebenes-html-schön-machen" data-numberify>Übrig gebliebenes HTML schön machen<a class="anchor ms-1" href="#übrig-gebliebenes-html-schön-machen"></a></h2>
<p>Wie bereits erwähnt enthalten viele exportiere Beiträge noch einiges an HTML-Quelltext, der vom Export-Tool nicht in Markdown umgewandelt werden konnte. Und ich werde noch eine Weile mit diesem HTML Code leben müssen, bis ich es irgendwann geschafft habe, alles in sinnvolles Markdown zu übersetzen.</p>
<p>Ich wollte aber schon vorher den neuen Blog mit Hugo veröffentlichen. Deshalb war es notwendig, dass ich diesen bestehenden HTML Code soweit schön mache, dass es am besten gar nicht auffällt, dass die Quelle noch kein Markdown verwendet.</p>
<p>Nachfolgend werden die dafür notwendigen Anpassungen erläutert.</p>

<h3 id="wichtig-wp-content-behalten" data-numberify>Wichtig: wp-content behalten<a class="anchor ms-1" href="#wichtig-wp-content-behalten"></a></h3>
<p>Damit nicht so gut wie alle Bilder und Fotos fehlen, die bisher nur über &ldquo;alten&rdquo; HTML-Code statt über Markdown eingebunden sind, habe ich eine Kopie des Verzeichnisses <code>wp-content/uploads/</code> auch im Webverzeichnis der neuen statischen Webseite eingebunden. So funktionieren alle bisherigen Verlinkungen und Einbettungen weiterhin.</p>
<p>Mit der Zeit werde ich alle Galerien im Blog so umschreiben, dass die Page Bundles benutzen, d. h. die Bilder für einen Beitrag sind zusammen mit dem Beitrag selbst in einem eigenen Verzeichnis.</p>

<h3 id="verzerrte-fotos-in-galerien" data-numberify>Verzerrte Fotos in Galerien<a class="anchor ms-1" href="#verzerrte-fotos-in-galerien"></a></h3>
<p>In einigen der Galerien wurden die Fotos noch in WordPress mit width=&ldquo;2000&rdquo; und height=&ldquo;xxx&rdquo; eingebunden. Das führte dazu, dass sie im neuen Hugo-Theme aufgrund der fehlenden Breite, oder weshalb auch immer, gestaucht angezeigt werden.</p>
<p>Daher habe ich die beiden Tags komplett entfernt mit:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s/ width=&#34;[0-9]{1,4}&#34;//g&#39;</span> *.md
</span></span><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s/ height=&#34;[0-9]{1,4}&#34;//g&#39;</span> *.md</span></span></code></pre></div>
<p>Diese Zeilen entfernen natürlich alle Vorkommen von width und height. Soweit ich gesehen habe, bleiben diese Tags nach dem Export aus WordPress aber wirklich nur bei Bildern und vermutlich auch bei Videos erhalten.</p>

<h3 id="unscharfe-fotos--zu-klein-wird-zu-groß-angezeigt" data-numberify>Unscharfe Fotos – Zu klein wird zu groß angezeigt<a class="anchor ms-1" href="#unscharfe-fotos--zu-klein-wird-zu-groß-angezeigt"></a></h3>
<p>In anderen Blogbeiträgen gab und gibt es immer noch unscharfe Fotos. Das liegt daran, dass diese Bilder in WordPress als kleine Vorschaubilder angezeigt wurden und bei einem Klick darauf die großen Varianten der Bilder in voller Auflösung in einer Lightbox geföffnet wurden.</p>
<p></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Unscharfes Bild" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_816x0_resize_q95_h2_catmullrom_3.webp" title="Unscharfes Bild" loading="lazy" width="816" height="847" /></picture><figcaption>Unscharfes Bild</figcaption></figure><p>
</p>
<p>So sah der Beitrag ursprünglich in WordPress aus:
</p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Wie es in WordPress aussah" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_816x0_resize_q95_h2_catmullrom_3.webp" title="Wie es in WordPress aussah" loading="lazy" width="816" height="674" /></picture><figcaption>Wie es in WordPress aussah</figcaption></figure><p>
</p>

<h4 id="erste-möglichkeit-bei-unscharfen-bildern-lightbox-benutzen" data-numberify>Erste Möglichkeit bei unscharfen Bildern: Lightbox benutzen<a class="anchor ms-1" href="#erste-möglichkeit-bei-unscharfen-bildern-lightbox-benutzen"></a></h4>
<p>Die verwendete Lightbox öffnet im Overlay nicht die kleine Datei sondern die verlinkte, große Datei. In der Lightbox ist das Bild somit scharf.</p>
<p>So sieht es dann aus:
</p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_5d4b7a29b4ffd2cfdc139f980d5d3ec3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_94cc4eae95910fd0164e99ee8ccd57bf.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_fed7e5cd9dd901989bfd84fd11bad4bc.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Große Variante des Bildes wird in der Lightbox geladen" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_5d4b7a29b4ffd2cfdc139f980d5d3ec3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_94cc4eae95910fd0164e99ee8ccd57bf.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_fed7e5cd9dd901989bfd84fd11bad4bc.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_fed7e5cd9dd901989bfd84fd11bad4bc.webp" title="Große Variante des Bildes wird in der Lightbox geladen" loading="lazy" width="816" height="810" /></picture><figcaption>Große Variante des Bildes wird in der Lightbox geladen</figcaption></figure><p>
</p>
<p>In Hugo werden nur noch diese kleinen Bilder in viel zu groß dargestellt. Dank einer verwendeten Lightbox werden zumindest beim Anklicken die Originalfotos in einem Overlay angezeigt und für die Übergangszeit reicht mir das so auch.</p>
<p>Für diese Lösung habe ich mich erst einmal entschieden.</p>

<h4 id="zweite-möglichkeit-bei-unscharfen-bildern-html-automatisiert-anpassen-" data-numberify>Zweite Möglichkeit bei unscharfen Bildern: HTML automatisiert anpassen …<a class="anchor ms-1" href="#zweite-möglichkeit-bei-unscharfen-bildern-html-automatisiert-anpassen-"></a></h4>
<p>Man kann das Problem auch damit beheben, dass man den HTML-Quelltext so abändert, dass statt der kleinen Dateien überall die Originaldateien eingebunden werden, aber weiterhin auch verlinkt bleiben.</p>
<p>Damit wird z. B. statt dem eingebetteten Bild <code>mumble-git-1-100x50.jpg</code> das Bild <code>mumble-git-1.jpg</code> eingebunden. Nicht optimal, da es aus sein kann, dass ein riesiges Originalfoto von einer Landschaft dann relativ klein angezeigt wird. Öffnet man einen Blogbeitrag mit einer Galerie von Landschaftsfotos, dann sieht man zwar nur kleine Bilder, der Browser lädt dann aber direkt alle Bilder in voller Auflösung herunter.</p>
<p>Deshalb habe ich mich gegen diese Lösung entschieden, obwohl sie am besten aussieht.</p>
<p>Hier trotzdem die Befehlszeile(n), um die URLs der kleinen Varianten der Bilder gegen die Originale zu ersetzen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#-[0-9]{1,4}x[0-9]{1,4}\.jpg#\.jpg#g&#39;</span> *.md
</span></span><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#-[0-9]{1,4}x[0-9]{1,4}\.png#\.png#g&#39;</span> *.md
</span></span><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#-[0-9]{1,4}x[0-9]{1,4}\.gif#\.gif#g&#39;</span> *.md</span></span></code></pre></div>
<p>Natürlich muss man diese Zeilen für die verwendeten Dateitypen anpassen (png, gif, …).</p>
<p>Das Ergebnis wäre dann:
</p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_78298c2eee0c2cdc88bdee4225e1021b.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_d406d7d22b0f55fb789d43d08d39d4a4.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_88d619b232c61be2427b2b0b387a7584.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Dank Eingettung des Originals ist es wieder scharf, verursacht aber auch mehr Traffic." srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_78298c2eee0c2cdc88bdee4225e1021b.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_d406d7d22b0f55fb789d43d08d39d4a4.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_88d619b232c61be2427b2b0b387a7584.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_88d619b232c61be2427b2b0b387a7584.webp" title="Dank Eingettung des Originals ist es wieder scharf, verursacht aber auch mehr Traffic." loading="lazy" width="816" height="810" /></picture><figcaption>Dank Eingettung des Originals ist es wieder scharf, verursacht aber auch mehr Traffic.</figcaption></figure><p>
</p>

<h3 id="srcsets-entfernen" data-numberify>srcsets entfernen<a class="anchor ms-1" href="#srcsets-entfernen"></a></h3>
<p>Um zusätzlich noch die srcsets aus solchen Galerien zu entfernen, kann man diese Zeile ausführen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s# class=&#34;.*;&#34; /&gt;#/&gt;#g&#39;</span> *.md</span></span></code></pre></div>
<p>Ich  habe das erst einmal sein lassen. Vielleicht schaffe ich es ja noch, dass diese srcsets doch noch genutzt werden, solange ich noch nicht alles auf Markdown umgewandelt habe.</p>

<h3 id="eingebettete-videos-werden-zu-breit-dargestellt" data-numberify>Eingebettete Videos werden zu breit dargestellt<a class="anchor ms-1" href="#eingebettete-videos-werden-zu-breit-dargestellt"></a></h3>
<p>Mit dem video-Tag eingebundene Videos sind im Theme so breit, dass sie teilweise hinter dem rechten Seitenpanel versteckt sind.</p>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Video hängt hinter der Seitenleiste" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_816x0_resize_q95_h2_catmullrom_3.webp" title="Video hängt hinter der Seitenleiste" loading="lazy" width="816" height="569" /></picture></a><figcaption>Video hängt hinter der Seitenleiste</figcaption></figure><p>
</p>
<p>Um das zu heben, habe ich erstmal ein bisschen css verwendet:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-css" data-lang="css"><span style="display:flex;"><span><span style="color:#f92672">video</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">max-width</span>: <span style="color:#ae81ff">100</span><span style="color:#66d9ef">%</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">height</span>: <span style="color:#66d9ef">auto</span>;
</span></span><span style="display:flex;"><span>}</span></span></code></pre></div></p>
<p>Damit werden alle Videoeinbettungen, auch die, die ich später mit Markdown verwenden werde, richtig angezeigt.</p>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Video ist wieder richtig" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_816x0_resize_q95_h2_catmullrom_3.webp" title="Video ist wieder richtig" loading="lazy" width="816" height="569" /></picture></a><figcaption>Video ist wieder richtig</figcaption></figure><p>
</p>
<p>Später werde ich den HTML Code durch einen Shortcode video ersetzen.</p>

<h2 id="artikelbilder" data-numberify>Artikelbilder<a class="anchor ms-1" href="#artikelbilder"></a></h2>
<p>In den WordPress-Themes, die ich bisher verwendet hatte, gab es immer Artikelbilder. Ich finde das sehr schön, weil es meiner Ansicht nach auflockernd wirkt und man besser erkennt, worum es in einem Blogbeitrag gehen könnte. Deshalb fand ich es schade, als ich bemerkte, dass in meinem ausgewählten Theme keine Artikelbilder zu sehen waren.</p>
<p>Ich habe dann selbst versucht Artikelbilder zu implementieren und dabei dann entdeckt, dass das Theme solche durchaus vorsieht und nur die richtigen Angaben im Front Matter fehlten.</p>
<p>Dank des Exports von WordPress landeten im Frontmatter bei immerhin ca. 1900 von 2460 Beiträgen die Angaben zu Artikelbildern im Stil von:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">featured_image</span>: <span style="color:#ae81ff">dateiname.jpg</span></span></span></code></pre></div></p>
<p>Doch das Hugo Theme erwartet die folgende Struktur:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">images</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#ae81ff">dateiname.jpg</span></span></span></code></pre></div></p>
<p>Kein Problem, denn mit dem Streamingeditor <code>sed</code> unter Linux ist das mit einem Befehl erleidgt:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s/^featured_image: (.*)$/images:\n  - \1/&#39;</span> *.md</span></span></code></pre></div>
<p>Seitdem werden, wie auch im WordPress zuvor, Artikelbilder auch im mit Hugo generierten Blog angezeigt.</p>

<h2 id="reicht-wieder" data-numberify>Reicht wieder<a class="anchor ms-1" href="#reicht-wieder"></a></h2>
<p>Das reicht auch schon für den zweiten Teil.</p>
<p>Im nächsten Teil geht es dann um Lightboxen, Kommentare, um verschiedene Konfigurationsmöglichkeiten und mehr.</p>
]]></content:encoded><enclosure url="https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/cover.png" length="130038" type="image/png"/></item><item><title>Umzug von WordPress zu Hugo – Teil 1 – Von den Gründen bis zum ersten funktionierenden Blog</title><link>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/</link><pubDate>Thu, 03 Feb 2022 07:30:33 +0100</pubDate><guid>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/</guid><description>Schon einige Male in den vergangenen Jahren habe ich versucht, meinen Blog von WordPress auf Hugo umzuziehen. Immer gab es dabei für mich unüberwindbare Hürden. Jetzt endlich hat es mal in einem neuen Anlauf funktioniert.
Hier berichte ich davon, wie genau ich das gemacht habe, was es zu bedenken galt und wie es im Ergebnis geworden ist. In erster Linie ist es für mich als Dokumentation gedacht, damit ich das in x Zeit noch nachvollziehen kann.</description><content:encoded><![CDATA[<p>Schon einige Male in den vergangenen Jahren habe ich versucht, meinen Blog von WordPress auf Hugo umzuziehen. Immer gab es dabei für mich unüberwindbare Hürden. Jetzt endlich hat es mal in einem neuen Anlauf funktioniert.</p>
<p>Hier berichte ich davon, wie genau ich das gemacht habe, was es zu bedenken galt und wie es im Ergebnis geworden ist. In erster Linie ist es für mich als Dokumentation gedacht, damit ich das in x Zeit noch nachvollziehen kann. Und wenn jemand anderes damit auch noch etwas anfangen kann, dann ist es noch besser.</p>
<p>Dabei schreibe ich übrigens das erste Mal einen Blogbeitrag mit einem einfachen Editor, offline, ohne Browser, in einem einfachen Textbearbeitungsprogramm. Und das fühlt sich gut an.</p>

<h2 id="wieso-überhaupt-weg-von-wordpress" data-numberify>Wieso überhaupt weg von WordPress?<a class="anchor ms-1" href="#wieso-überhaupt-weg-von-wordpress"></a></h2>
<p>Ich habe WordPress seit 2009 für meinen Blog benutzt und es immer auf eigenen Servern selbst gehostet. Ich war immer sehr zufrieden damit. WordPress hat es mir ermöglicht, mich immer nur auf den Inhalt konzentrieren zu können und hat mir die ganze Arbeit drumherum abgenommen. Und es ist immer noch so. Das schätze ich an dem Content Management System WordPress. Jedes Upgrade auf eine neue Version war immer fehlerfrei mit nur wenigen Klicks möglich.</p>
<p>Die meisten Funktionen von WordPress habe ich nie benutzt. Und mit dem Update auf den Gutenberg-Editor und jetzt kürzlich auf 5.9 mit dem Super Feature &ldquo;Full Site Editing&rdquo; ist noch klarer geworden, dass ich solch ein komplexes System nicht benötige. Es ist immer noch sehr einfach zu bedienen und zu aktualisieren, aber ich brauche es eben nicht.</p>
<p>Was ich brauche, ist eine einfache Möglichkeit, Texte zu schreiben, die Maus möglichst nicht bewegen zu müssen und außerdem benötige ich nur die grundlegensten Formatierungen. Kurzum das, was <a  class='urlextern'  href="https://daringfireball.net/projects/markdown/">Markdown</a> bietet.</p>
<p>Natürlich sind da noch andere Aspekte:</p>
<ul>
<li>Wartbarkeit: Webserver, PHP, Datenbank, alles will gepflegt werden und benötigt ab und zu Aufmerksamkeit. Mit Hugo kann man den kompletten Blog, der aus statischen Dateien (HTML, CSS, JavaScript) besteht, auf einen Webserver werfen und für immer dort liegen lassen.</li>
<li>Portierbarkeit/Backup: Sollte ich mal vom Rad fallen und nicht mehr aufstehen, kann man sich das Archiv herunterladen und hat weiterhin Zugriff auf die Inhalte des Blogs. Entsprechend wird man sich später das einmal alle x Zeit aktualisierte Archiv herunterladen können. Dazu später mehr.</li>
<li>Sicherheit: Da nichts dynamisch ausgeführt wird, gibt es auch keine Sicherheitslücken, die jemand ausnutzen könnte.</li>
<li>&ldquo;Einfachheit&rdquo;: Text-Editor, Hugo laufen lassen, hochladen per SFTP. Fertig.</li>
</ul>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Fenster eines Texteditors unter KDE/Plasma" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_816x0_resize_q95_h2_catmullrom_3.webp" title="Fenster eines Texteditors unter KDE/Plasma" loading="lazy" width="816" height="523" /></picture></a><figcaption>Fenster eines Texteditors unter KDE/Plasma</figcaption></figure><p>
</p>

<h2 id="ein-schönes-theme-für-hugo-finden" data-numberify>Ein schönes Theme für Hugo finden<a class="anchor ms-1" href="#ein-schönes-theme-für-hugo-finden"></a></h2>
<p>Man kann natürlich auch selbst ein Theme bauen, aber das ist nichts für mich.</p>
<p>Eine Liste von aktuell 285 Themes gibt es auf der Webseite von Hugo, siehe <a  class='urlextern'  href="https://themes.gohugo.io/">hier</a>.</p>
<p>Ich habe mich für das Theme <a  class='urlextern'  href="https://themes.gohugo.io/themes/hugo-theme-bootstrap/">Bootstrap Theme for Personal Blog and Documentations</a> entschieden, weil es fast alles liefert, was ich benötige und vielfältige Einstellungsmöglichkeiten hat.</p>
<p>Was ich besonders mag:</p>
<ul>
<li>Dark Mode/Light Mode</li>
<li>Suchfunktion (<a  class='urlextern'  href="https://fusejs.io">fuse.js</a>)</li>
<li>Durch Ausblenden der Seitenliste kann der Inhaltsbereich breiter gemacht werden.</li>
<li>Es gibt bereits Shortcodes für Nachrichtenboxen (Info, Alarm, &hellip;). Siehe <a  class='urlextern'  href="https://hbs.razonyang.com/en/docs/shortcodes/alert/">hier</a>.</li>
<li><a  class='urlextern'  href="https://gohugo.io/templates/internal/#configure-twitter-cards">Twitter Cards</a> und <a  class='urlextern'  href="https://gohugo.io/templates/internal/#configure-open-graph">Open Graph</a></li>
<li>Responsive</li>
<li>optional mehrsprachig</li>
<li>Archivseiten</li>
<li>Shortcods für Verleinern von Bildern. Die verkleinerten Bilder werden beim Rendern von Hugo aus den Originaldateien erzeugt.</li>
<li>Lazy loading für Bilder</li>
<li>Inhaltsverzeichnis für Blogbeiträge</li>
<li>Keine Einbindung von externen Inhalten</li>
<li>Liste von &ldquo;ähnlichen Beiträgen&rdquo;</li>
</ul>

<h2 id="vor-dem-export-in-wordpress-aufräumen" data-numberify>Vor dem Export in WordPress aufräumen<a class="anchor ms-1" href="#vor-dem-export-in-wordpress-aufräumen"></a></h2>

<h3 id="tabellen-aufräumen" data-numberify>Tabellen aufräumen<a class="anchor ms-1" href="#tabellen-aufräumen"></a></h3>
<p>Vor dem Export der Daten kann man den Blog noch etwas aufräumen. Hat man z. B. wie ich über die Jahre viele verschiedene Plugins ausprobiert und wieder entfernt, dann könnten die Daten der Plugins immer noch irgendwo in den Tabellen der Datenbank liegen und beim Export in den Daten landen. Das wären alles zusätzliche Daten, die man nicht benötigt.</p>
<p>Dazu hatte ich mal einen eigenen Blogbeitrag verfasst, siehe <a  href="/2021/05/datenbank-von-wordpress-auch-mal-aufraeumen/">hier</a>.</p>

<h3 id="entwürfe" data-numberify>Entwürfe<a class="anchor ms-1" href="#entwürfe"></a></h3>
<p>Werden Entwürfe exportiert, dann erhalten diese in der exportierten Version kein Datum und sind somit erstmal aus dem Sichtbereich raus oder bekommen seltsame Namen/URLs zugewiesen wie z. B. &ldquo;?p=52696/&rdquo;, das der fortlaufenden ID von Blogbeiträgen entspricht. Das will man später alles nicht einzeln bearbeiten müssen. Deshalb Entwürfe löschen oder veröffentlichen.</p>

<h3 id="verlinkungen-in-wordpress" data-numberify>Verlinkungen in WordPress<a class="anchor ms-1" href="#verlinkungen-in-wordpress"></a></h3>
<p>Man kann in WordPress entweder die komplette URL verwenden (Standard), um auf einen Beitrag im eigenen Blog zu verlinken oder die ID des Beitrags verwenden.</p>
<p>Die komplette URL wäre z. B. &ldquo;natenom.de/2021/01/beitrag-ueber-den-kleinen-elefanten&rdquo; während die ID &ldquo;natenom.de/?p=12345&rdquo; wäre.</p>
<p>Solche Verlinkungen sollte man noch im laufenden WordPress Blog finden und in die erste Form (lange URL) überführen, da die zweite Form mit der ID in Hugo nicht funktionieren wird.</p>
<p>Dazu reicht die Suchfunktion im Adminpanel aus. Man sucht nach &ldquo;/?p=&rdquo;. In meinem Fall fanden sich ca. 130 solcher Beiträge mit ID Verlinkungen.</p>

<h2 id="optional-backup-des-blogs--für-hugo-nicht-relevant" data-numberify>(optional) Backup des Blogs – Für Hugo nicht relevant<a class="anchor ms-1" href="#optional-backup-des-blogs--für-hugo-nicht-relevant"></a></h2>
<p>Da der Blog am Ende abgeschaltet werden soll, habe ich ein letztes Mal Backups gemacht:</p>
<ul>
<li>Backup der WordPress Datenbank</li>
<li>Als Admin in WordPress angemeldet und unter Werkzeuge -&gt; Daten exportieren -&gt; Alle Inhalte ausgewählt und die xml-Datei heruntergeladen. In dieser Datei sind alle Beiträge, alle Seiten und auch die Kommentare von Benutzern enthalten. Nicht jedoch die hochgeladenen Dateien. In meinem Fall ist die Datei um 50 MiB groß und hat um die 50000 Zeilen.</li>
<li>Backup des kompletten WordPress-Verzeichnisses inklusive den hochgeladenen Dateien und dem ganzen PHP-Zeug</li>
<li>Herunterladen der kompletten Webseite mit wget, um später noch nachvollziehen zu können, unter welchen URLs was zu finden war. Für solche URLs, die Hugo nicht generiert. Die könnte man dann mit einem Webserver passend weiterleiten. Die Kommandozeile dafür ist:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>wget --recursive --domains<span style="color:#f92672">=</span>natenom.de --html-extension --page-requisites --convert-links --no-parent <span style="color:#e6db74">&#34;/&#34;</span> -R <span style="color:#e6db74">&#34;*xmlrpc*&#34;</span> --reject-regex <span style="color:#e6db74">&#34;.*wp-content.*&#34;</span></span></span></code></pre></div>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content"><p>Wenn es Probleme gibt und eine Meldung in der Form <code>no follow attribute found</code>, dann benötigt man zusätzlich noch diesen Parameter:</p>
<pre><code>-erobots=off
</code></pre>
</div>
</div>


<p>Das Verzeichnis <code>wp-content</code> habe ich bewusst ausgelassen, da es nur hochgeladene Dateien enthält (ca. 7 GiB), die bereits in einem anderen Backup enthalten sind.</p>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_816x0_resize_q95_h2_catmullrom_3.webp" title="Export Tool von WordPress. Exportiert alles außer der hochgeladenen Dateien." loading="lazy" width="816" height="430" /></picture></a><figcaption>Export Tool von WordPress. Exportiert alles außer der hochgeladenen Dateien.</figcaption></figure><p>
</p>

<h2 id="daten-für-hugo-aus-wordpress-exportieren" data-numberify>Daten für Hugo aus WordPress exportieren<a class="anchor ms-1" href="#daten-für-hugo-aus-wordpress-exportieren"></a></h2>
<p>Mit dem Tool <a  class='urlextern'  href="https://github.com/SchumacherFM/wordpress-to-hugo-exporter">WordPress to Hugo Exporter</a> kann man alle Seiten und Beiträg eines Blogs in eine Zip-Datei exportieren.</p>
<p>Ich gehe hier nicht darauf ein, wie man das Tool verwendet, da das ausreichend gut auf dessen Webseite erklärt ist. Wichtig ist hier nur, dass man am Ende eine Datei erhält, hier im Beispiel mit dem Namen wpexport.zip.</p>
<p>Auf der Projektseite steht, was man an der PHP-Datei anpassen muss, damit auch Kommentare exportiert werden.</p>
<p>Der Export kann eine ganze Weile dauern und sollte deshalb auf der Kommandozeile ausgeführt werden. Die <code>wpexport.zip</code> meines Blogs hatte eine Dateigröße von etwas mehr als 7 GiB.</p>
<p>Die Datei <code>wpexport.zip</code> hat diese Struktur:</p>
<pre tabindex="0"><code>seite-a/index.md
seite-b/index.md
irgendeine-seite/index.md
posts/
    2022-01-05-mein-beitrag-im-januar
    2022-01-06-mein-beitrag-ueber-bluemeleinchen
    2022-02-08-ein-neuer-beitrag-mit-tollen-fahrraedern
wp-content/
    uploads/
        2022/
            01/
                2022-01-04-hochgeladenes-bild-1.jpg
                2022-01-04-hochgeladenes-bild-2.jpg
config.yaml
</code></pre><ul>
<li>Es sind alle &ldquo;Seiten&rdquo; des Blogs als Verzeichnisse enthalten, in den index.md-Dateien sind die Inhalte.</li>
<li>Die &ldquo;Beiträge&rdquo; (Englisch &ldquo;Posts&rdquo;) liegen als md-Dateien im Verzeichnis &ldquo;posts&rdquo;.</li>
<li>Die hochgeladenen Dateien wie Fotos, Screenshots oder auch Audio und Video liegen im Verzeichnis wp-content/uploads, sortiert nach Jahr und Monat.</li>
<li>Dann gibt es noch die Datei config.yaml, welche die URL des Blogs enthält, den Namen und die Beschreibung.</li>
</ul>
<p>Die Daten lädt man dann auf den eigenen PC herunter.</p>

<h2 id="eine-webseite-mit-hugo-anlegen-und-theme-einfügen" data-numberify>Eine Webseite mit Hugo anlegen und Theme einfügen<a class="anchor ms-1" href="#eine-webseite-mit-hugo-anlegen-und-theme-einfügen"></a></h2>
<p>Ich will hier nicht darauf eingehen, wie man eine Webseite mit Hugo anlegt und das Theme einfügt, das ist auf der Projektseite bereits ausführlich gut dokumentiert, siehe <a  class='urlextern'  href="https://gohugo.io/getting-started/quick-start/">hier</a>.</p>
<p>Sobald das erledigt und das Theme eingebunden ist, kann man die exportierten Daten aus dem heruntergeladenen Archiv entpacken und die Daten in das Verzeichnis des neuen Blogs hineinkopieren:</p>
<ul>
<li>Die Datei <code>config.yaml</code> habe ich weg gelassen.</li>
<li>Das Verzeichnis <code>posts</code> wird nach <code>content</code> kopiert.</li>
<li>Das Verzeichnisse <code>seite-x</code> werden nach <code>content/pages</code> kopiert.</li>
<li>Das Verzeichnis <code>wp-content</code> wird nach <code>static</code> kopiert.</li>
</ul>

<h2 id="ein-bisschen-konfiguration" data-numberify>Ein bisschen Konfiguration<a class="anchor ms-1" href="#ein-bisschen-konfiguration"></a></h2>
<p>Eine Liste aller Einstellungsmöglichkeiten gibt es auf der <a  class='urlextern'  href="https://hbs.razonyang.com/v0/en/docs/configuration/">Seite des Theme-Entwicklers</a>.</p>

<h3 id="taxonomie" data-numberify>Taxonomie<a class="anchor ms-1" href="#taxonomie"></a></h3>
<p>Bei der Taxonomie wollte ich die URLs von WordPress möglichst erhalten.</p>
<p>Per Voreinstellung verwendet Hugo für tags in der URL &ldquo;tags&rdquo;, WordPress jedoch &ldquo;tag&rdquo;. Bei Kategorien verwendet Hugo &ldquo;categories&rdquo; und WordPress &ldquo;category&rdquo;.</p>
<p>Das kann man in der <code>config.toml</code> anpassen mit:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">taxonomies</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">category</span> = <span style="color:#e6db74">&#39;category&#39;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">tag</span> = <span style="color:#e6db74">&#39;tag&#39;</span></span></span></code></pre></div>
<p>In meinem ausgewählten Theme funktioniert das jedoch leider nicht, da zwingend &ldquo;tags&rdquo; und &ldquo;categories&rdquo; notwendig sind. Kann man sicher anpassen, ich aber nicht. Also bleibt es bei den Voreinstellungen. Ich werde es dann einfach mit dem Webserver weiterleiten lassen.</p>
<p>In Nginx z. B. mit:</p>
<pre tabindex="0"><code>rewrite ^/tag/(.*)$ /tags/$1 redirect;
rewrite ^/category/(.*)$ /categories/$1 redirect;
</code></pre><p>Wenn das gut funktioniert, kann man das später auf <em>permanent</em> umschreiben.</p>

<h3 id="beiträge-nicht-gelistet" data-numberify>Beiträge nicht gelistet<a class="anchor ms-1" href="#beiträge-nicht-gelistet"></a></h3>
<p>Auf der Startseite des Blogs wurden die Beiträge nicht gelistet. Mit Herumprobieren konnte ich herausfinden, dass das an dem Eintrag &ldquo;type: post&rdquo; im Front Matter (Metadaten eines Beitrags) lag. Daher habe ich mit dem folgenden Shell-Aufruf diese Zeile in allen md-Dateien gelöscht:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i <span style="color:#e6db74">&#34;/^type: post</span>$<span style="color:#e6db74">/d&#34;</span> *.md</span></span></code></pre></div>

<h3 id="sonstige-konfiguration" data-numberify>Sonstige Konfiguration<a class="anchor ms-1" href="#sonstige-konfiguration"></a></h3>
<p>Hier noch ein paar weitere wichtige Dinge, die ich in der Konfiguration eingestellt habe.
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#960050;background-color:#1e0010">…</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">baseURL</span> = <span style="color:#e6db74">&#34;/&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">rssLimit</span> = <span style="color:#ae81ff">15</span>
</span></span><span style="display:flex;"><span>[<span style="color:#960050;background-color:#1e0010">…</span>]
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">params</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">comment</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">breadcrumb</span> = <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">palette</span> = <span style="color:#e6db74">&#34;blue&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">dateFormat</span> = <span style="color:#e6db74">&#34;Mon, 02 Jan 2006 15:04&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">mainSections</span> = [<span style="color:#e6db74">&#34;posts&#34;</span>, <span style="color:#e6db74">&#34;pages&#34;</span> ]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">poweredBy</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">math</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">diagram</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">logo</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">description</span> = <span style="color:#e6db74">&#34; Verkehrswende, Fahrrad, CriticalMass, OpenBikeSensor, SimRa, Mumble, Open Source, Minimalist, OpenStreetMap, Müllsammeln&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">recentPostCount</span> = <span style="color:#ae81ff">5</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">relatedPostCount</span> = <span style="color:#ae81ff">6</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">categoryCount</span> = <span style="color:#ae81ff">200</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">tagCount</span> = <span style="color:#ae81ff">150</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">searchBar</span> = <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">post</span>.<span style="color:#a6e22e">copyright</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">search</span>.<span style="color:#a6e22e">fuse</span>.<span style="color:#a6e22e">threshold</span> = <span style="color:#ae81ff">0.0</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">countTaxonomyPosts</span> = <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">post</span>.<span style="color:#a6e22e">excerpt</span> = <span style="color:#e6db74">&#34;description&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">viewer</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">showShare</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">socialShare</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">outputs</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">home</span> = [<span style="color:#e6db74">&#34;HTML&#34;</span>, <span style="color:#e6db74">&#34;RSS&#34;</span>, <span style="color:#e6db74">&#34;JSON&#34;</span>]</span></span></code></pre></div></p>

<h2 id="von-absoluten-urls-zu-relativen-urls" data-numberify>Von absoluten URLs zu relativen URLs<a class="anchor ms-1" href="#von-absoluten-urls-zu-relativen-urls"></a></h2>
<p>Ich habe keine Ahnung von SEO und habe mich nie damit beschäftigt. Könnte es sein, dass WordPress aus SEO-Gründen absoulte URLs verwendet und nicht realtive? Ich habe dazu die Info auf einer Webseite gefunden, dass relative Links problematisch werden könnten, wenn der Server nicht richtig eingerichtet sei.</p>
<p>Hat man Bedenken, dann weiter zum nächsten Abschnitt.</p>
<p>Aber: Will man den neuen Blog auf dem eigenen PC anschauen, benötigt man ohne die Veränderungen der URLs eine Internetverbindung, damit eingebettete Inhalte wie z. B. Bilder vom Browser von der ursprünglichen Webseite heruntergeladen werden können. Oder aber man biegt das DNS temporär um, muss dann aber zumindest aus https http machen, und so weiter.</p>

<h3 id="absolute-urls-auf-hochgeladene-dateien" data-numberify>Absolute URLs auf hochgeladene Dateien<a class="anchor ms-1" href="#absolute-urls-auf-hochgeladene-dateien"></a></h3>
<p>Alle Verlinkungen auf Fotos, Bilder und Videos sind in WordPress mit der absoulten URL angegeben, in meinem Fall mit <code>natenom.de/wp-content/uploads/...</code>. Und das wird so auch in die md-Dateien exportiert.</p>
<p>Deshalb kann man die URLs mit dem Streameditor sed umschreiben lassen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#/wp-content/uploads/#/wp-content/uploads/#g&#39;</span> *.md</span></span></code></pre></div>
<p>(Ich habe das aktuell erstmal noch nicht getan.)</p>
<p>Das Kommando führt man in allen Verzeichnissen aus, in denen md-Dateien liegen. Man könnte das auch so umschreiben, dass es ausgehend vom neuen Blogverzeichnis alle md-Dateien findet und so alle erfasst. Aber so reicht es mir.</p>

<h3 id="absolute-urls-auf-blogbeiträge" data-numberify>Absolute URLs auf Blogbeiträge<a class="anchor ms-1" href="#absolute-urls-auf-blogbeiträge"></a></h3>
<p>Das selbe gilt auch für Verlinkungen im Blogbeiträgen auf andere Beiträg im eigenen Blog. Auch diese URLs lasse ich umschreiben:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#/#/#g&#39;</span> *.md</span></span></code></pre></div>
<p>(Ich habe das aktuell erstmal noch nicht getan.)</p>
<p>Aus dem absoulten Link <code>/</code> wird dadurch <code>/</code>.</p>

<h2 id="umlaute-in-urls-von-kategorien-und-tags" data-numberify>Umlaute in URLs von Kategorien und Tags<a class="anchor ms-1" href="#umlaute-in-urls-von-kategorien-und-tags"></a></h2>
<p>Ich verwende im Blog das Tag &ldquo;Müllsammeln&rdquo; und die Kategorie &ldquo;Mobilität&rdquo;. Wordpress hat dabei automatisch die Umlaute in den dafür genutzten URLs in die alternativen Schreibweisen &ldquo;muellsammeln&rdquo; und &ldquo;mobilitaet&rdquo; umgewandelt. Hugo macht das nicht, weshalb dort das Tag auch &ldquo;müllsammeln&rdquo; lautet.</p>
<p>Es gibt mehrere Lösungen:</p>
<ol>
<li>Es dabei belassen, denn mittlerweile sind diese Zeichen kein Problem mehr. Es sieht nur nicht sonderlich schön aus, wenn man statt <strong>mobilität</strong> das hier sieht <strong>mobilit%C3%A4t</strong></li>
<li>Ohne Veränderungen an den Beiträgen wäre die Option <strong>removePathAccents</strong> von Hugo möglich, die aus &ldquo;mobilität&rdquo; &ldquo;mobilitat&rdquo; macht.</li>
<li>Hugo selbst zu verändern, <a  class='urlextern'  href="https://www.von-laufenberg.de/blog/it/hugo-umlaute/">siehe hier</a>.</li>
<li>Alle Vorkommen der Tags in den Beiträgen mit sed umschreiben und ö durch oe ersetzen usw.</li>
<li>Weiterleitungen durch den Webserver, siehe unten.</li>
</ol>
<p>Einen Issue mit vielen Informationen zu diesem Theme gibt es auf Github, <a  class='urlextern'  href="https://github.com/gohugoio/hugo/issues/3476">siehe hier</a>. Ein weitere Issue zu dem Thema ist seit November 2021 noch offen, <a  class='urlextern'  href="https://github.com/gohugoio/hugo/issues/9134">siehe hier</a>.</p>
<p>Ich habe mich entschieden, das so zu belassen das erst einmal mit Weiterleitungen zu &ldquo;fixen&rdquo; und zu schauen, was sich bei dem Issue tut.</p>
<p>In Nginx sind diese:</p>
<pre tabindex="0"><code>rewrite ^/tag/muellsammeln/(.*)$ /tags/müllsammeln/$1 redirect;
rewrite ^/category/mobilitaet/(.*)$ /categories/mobilität/$1 redirect;
rewrite ^/tag/(.*)$ /tags/$1 redirect;
rewrite ^/category/(.*)$ /categories/$1 redirect;
</code></pre><p>Ich nutze bei solchen Dingen am Anfang immer erst redirect, was dem HTTP Status 302 entspricht und ändere das dann irgendwann zu permanent (Status 301) um.</p>

<h2 id="fehlerseite-für-404" data-numberify>Fehlerseite für 404<a class="anchor ms-1" href="#fehlerseite-für-404"></a></h2>
<p>Falls doch mal eine Seite nicht gefunden wird, habe ich die <code>404.html</code> in Nginx eingerichtet:</p>
<pre tabindex="0"><code>error_page 404 /404.html;
</code></pre><p>Hier kann man die Seite mal ansehen: <a  href="/blabla-diese-seite-gibt-es-nicht">Dieser Link zeigt auf eine nicht vorhandene Seite</a>.</p>

<h2 id="damit-erstmal-keine-inhalte-fehlen" data-numberify>Damit erstmal keine Inhalte fehlen<a class="anchor ms-1" href="#damit-erstmal-keine-inhalte-fehlen"></a></h2>
<p>Würde man jetzt schon Hugo starten, würden vermutlich viele Inhalte in verschiedenen Beiträgen fehlen. Das liegt daran, dass das oben genannte Export-Tool viele HTML Tags nicht in Markdown konvertieren kann und dann an diesen Stellen den HTML-Quelltext in die exportierten md-Dateien schreibt. Doch Hugo filtert diesen HTML-Quelltext beim Rendern der Website heraus.</p>
<p>Damit ich nicht erst alle 2560 Blogbeiträge manuell überprüfen und korrigieren muss, bevor ich den neuen Blog öffentlich machen kann, habe ich mich entschieden, dieses Verhalten von Hugo umzustellen und Hugo anzuweisen, den HTML-Quelltext nicht herauszufiltern. Das ist zwar nicht im Sinne des Erfinders aber so habe ich die Möglichkeit, die Arbeit auf <em>irgendwann</em> später zu verschieben.</p>
<p>Details dazu findet man <a  class='urlextern'  href="https://gohugo.io/news/0.60.0-relnotes/">hier</a>. Suche nach <code>unsafe</code>.</p>
<p>In die config.toml fügt man dazu Folgendes ein:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">markup</span>]
</span></span><span style="display:flex;"><span>  [<span style="color:#a6e22e">markup</span>.<span style="color:#a6e22e">goldmark</span>]
</span></span><span style="display:flex;"><span>    [<span style="color:#a6e22e">markup</span>.<span style="color:#a6e22e">goldmark</span>.<span style="color:#a6e22e">renderer</span>]
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">unsafe</span> = <span style="color:#66d9ef">true</span></span></span></code></pre></div>

<h2 id="run-hugo-run" data-numberify>Run Hugo, Run<a class="anchor ms-1" href="#run-hugo-run"></a></h2>
<p>Jetzt kann man Hugo veranlassen, den neuen Blog das erste Mal zu rendern und dann lokal zur Verfügung zu stellen. Per Voreinstellung ist er unter localhost:1313 erreichbar.</p>
<p>Dazu wechselt man auf der Kommandozeile in das Verzeichnis des neuen Blogs und führt aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>hugo server --renderToDisk -D -E -F -v</span></span></code></pre></div>
<p>Jetzt werden alle gerenderten Dateien und auch die aus dem <code>static</code>-Verzeichnis in das Verzeichnis <code>public</code> kopiert, welches Hugo automatisch erstellt, wenn es noch nicht existiert.</p>
<p>Sobald alles bereit ist, gibt es eine Meldung wie etwa:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>                   |  DE   
</span></span><span style="display:flex;"><span>-------------------+-------
</span></span><span style="display:flex;"><span>  Pages            | <span style="color:#ae81ff">4350</span>  
</span></span><span style="display:flex;"><span>  Paginator pages  | <span style="color:#ae81ff">1694</span>  
</span></span><span style="display:flex;"><span>  Non-page files   |    <span style="color:#ae81ff">1</span>  
</span></span><span style="display:flex;"><span>  Static files     |   <span style="color:#ae81ff">88</span>  
</span></span><span style="display:flex;"><span>  Processed images |    <span style="color:#ae81ff">0</span>  
</span></span><span style="display:flex;"><span>  Aliases          |  <span style="color:#ae81ff">889</span>  
</span></span><span style="display:flex;"><span>  Sitemaps         |    <span style="color:#ae81ff">1</span>  
</span></span><span style="display:flex;"><span>  Cleaned          |    <span style="color:#ae81ff">0</span>  
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Built in <span style="color:#ae81ff">45228</span> ms
</span></span><span style="display:flex;"><span>Watching <span style="color:#66d9ef">for</span> changes in /home/natenom-web-hugo/<span style="color:#f92672">{</span>assets,content,layouts,static,themes<span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>Watching <span style="color:#66d9ef">for</span> config changes in /home/natenom-web-hugo/config.toml, <span style="color:#f92672">[</span>…<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>Environment: <span style="color:#e6db74">&#34;development&#34;</span>
</span></span><span style="display:flex;"><span>Serving pages from /home/natenom-web-hugo/public
</span></span><span style="display:flex;"><span>Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
</span></span><span style="display:flex;"><span>Web Server is available at http://localhost:1313/ <span style="color:#f92672">(</span>bind address 127.0.0.1<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>Press Ctrl+C to stop</span></span></code></pre></div>

<h2 id="erstmal-fertig" data-numberify>Erstmal fertig<a class="anchor ms-1" href="#erstmal-fertig"></a></h2>
<p>Das reicht dann auch wieder für diesen Beitrag. Man kann jetzt schon im eigenen Blog offline umgucken und wird hier und da noch unschöne Dinge finden, wie falsch dargestellte Bilder.</p>
<p>In <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2">Teil 2</a> geht es darum, für die Übergangszeit das übrig gebliebene HTML, das nicht zu Markdown konvertiert werden konnte, automatisiert so zu verändern, dass der Blog trotzdem ansehnlich ist, wenn auch noch nicht perfekt.</p>
]]></content:encoded><enclosure url="https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/cover.png" length="162917" type="image/png"/></item><item><title>RSSBridges – Feeds auch dann abonnieren, wenn die Webseite selbst keinen anbietet</title><link>https://natenom.de/2018/05/rssbridges-feeds-auch-dann-abonnieren-wenn-die-webseite-selbst-keinen-anbietet/</link><pubDate>Mon, 14 May 2018 16:57:39 +0000</pubDate><guid>https://natenom.de/2018/05/rssbridges-feeds-auch-dann-abonnieren-wenn-die-webseite-selbst-keinen-anbietet/</guid><description><![CDATA[<p>Ich hatte <a  class='urlextern'  href="https://github.com/RSS-Bridge/rss-bridge/">RSS-Bridge</a> schon vor längerem <a  href="/2015/08/rss-bridge-feeds-fuer-webseiten-die-keine-haben-oder-haben-wollen/">hier</a> vorgestellt.</p>
<p>Habe das damals lokal aufgesetzt und nutze es seitdem unverändert für Twitter, Google und Youtube.</p>]]></description><content:encoded><![CDATA[<p>Ich hatte <a  class='urlextern'  href="https://github.com/RSS-Bridge/rss-bridge/">RSS-Bridge</a> schon vor längerem <a  href="/2015/08/rss-bridge-feeds-fuer-webseiten-die-keine-haben-oder-haben-wollen/">hier</a> vorgestellt.</p>
<p>Habe das damals lokal aufgesetzt und nutze es seitdem unverändert für Twitter, Google und Youtube.</p>
<p>Vor einiger Zeit habe ich RSS-Bridge auf die neuste Version aktualisiert und es gibt Unmengen mehr an Bridges, z. B. für:</p>
<li style="list-style-type: none;">
  <ul>
    <li>
      Amazon
    </li>
    <li>
      Instagram
    </li>
    <li>
      Bandcamp
    </li>
    <li>
      DuckDuckGo
    </li>
    <li>
      Flickr
    </li>
    <li>
      F-Droid
    </li>
    <li>
      GitHub <em>(Wieso eigentlich? Man kann doch bei <a href="/2018/01/verschiedene-news-feeds-eines-wordpress-blogs-und-weiterer-dienste-nutzen/">GitHub selbst Feeds abonnieren</a>.)</em>
    </li>
    <li>
      Mixcloud
    </li>
    <li>
      Pinterest
    </li>
    <li>
      Soundcloud
    </li>
    <li>
      Steam
    </li>
    <li>
      WordPress (Holt den ganzen Artikel; nützlich, wenn der <a href="/2018/01/den-ganzen-artikel-in-tiny-tiny-rss-anzeigen-auch-wenn-im-feed-der-webseite-nur-ein-ausschnitt-drin-ist/">Blog-Feed selbst nur Auszüge anzeigt.</a>)
    </li>
    <li>
      WordPress-Plugins<br /> Das ist für mich interessant, da ich im Blog als unpriviligerter Benutzer arbeite und deshalb meist nicht mitbekomme, ob es Updates für Plugins gibt.
    </li>
  </ul>
</li>
<p>Die vollständige Liste der Bridges gibt es auf der Projektseite, <a  class='urlextern'  href="https://github.com/RSS-Bridge/rss-bridge/tree/master/bridges">siehe hier</a>.</p>]]></content:encoded></item><item><title>Wie man ein dynamisches MediaWiki in eine statische Webseite (nur HTML-Dateien) umwandeln kann</title><link>https://natenom.de/2017/10/wie-man-ein-dynamisches-mediawiki-in-eine-statische-webseite-nur-html-dateien-umwandeln-kann/</link><pubDate>Sat, 07 Oct 2017 11:16:25 +0000</pubDate><guid>https://natenom.de/2017/10/wie-man-ein-dynamisches-mediawiki-in-eine-statische-webseite-nur-html-dateien-umwandeln-kann/</guid><description><![CDATA[<p>Ich habe mein Englisch sprachiges Wiki unter wiki.natenom.com schon Anfang diesen Jahres <a  href="/2017/02/mein-mediawiki-auf-wiki-natenom-com-geht-in-den-ruhestand/">in den Ruhestand geschickt</a>. Alle Inhalte waren jedoch weiterhin verfügbar bzw. viele Seiten wurden in mein Wiki unter <a  href="https://wiki.natenom.de/">wiki.natenom.de</a> verschoben und entsprechend mit 301-Weiterleitungen versehen.</p>]]></description><content:encoded><![CDATA[<p>Ich habe mein Englisch sprachiges Wiki unter wiki.natenom.com schon Anfang diesen Jahres <a  href="/2017/02/mein-mediawiki-auf-wiki-natenom-com-geht-in-den-ruhestand/">in den Ruhestand geschickt</a>. Alle Inhalte waren jedoch weiterhin verfügbar bzw. viele Seiten wurden in mein Wiki unter <a  href="https://wiki.natenom.de/">wiki.natenom.de</a> verschoben und entsprechend mit 301-Weiterleitungen versehen.</p>
<p>Doch obwohl ich im Wiki nichts mehr gemacht hatte, musste ich mich doch immer wieder um Sicherheitsupdates für MediaWiki kümmern, auf dem dieses Wiki basiert.</p>
<p>Deshalb wollte ich schon mehrmals dieses Wiki mit Hilfe von wget herunterladen und dann als statische Version nur mit HTML-Dateien wieder hosten. Bei meinen letzten beiden Versuchen, das zu tun, bin ich immer an etwas gescheitert. Heute habe ich es endlich geschafft nach mehreren Stunden Arbeit und daher soll der Ablauf hier hinterlegt sein.</p>
<!--more-->
<p>Ausgangspunkt war dieser <a  class='urlextern'  href="http://camwebb.info/blog/2012-12-20/">Blogbeitrag</a>. Jedoch musste ich den Aufruf für mein Wiki etwas anpassen und noch weitere Arbeiten erledigen.</p>

<h2 id="weiterleitungen-temporär-deaktivieren" data-numberify>Weiterleitungen temporär deaktivieren<a class="anchor ms-1" href="#weiterleitungen-temporär-deaktivieren"></a></h2>
<p>Wichtig bezüglich meines Wikis ist hier der Punkt, dass ich früher bereits viele Seiten manuell in mein Dokuwiki verschoben und auch entsprechende 301-Weiterleitungen gesetzt habe. Deshalb habe ich diese Weiterleitungen temporär entfernt und dann erst die Seite heruntergeladen.</p>
<p>Man könnte sie auch aktiv lassen und stattdessen noch bei wget diesen Parameter nutzen:</p>
<blockquote>
<pre>--max-redirect 0</pre>
</blockquote>
<p>Damit würden Weiterleitungen generell ignoriert werden. Mir war es aber wichtig, alle Seiten des Wikis im Archiv zu haben.</p>

<h2 id="wget" data-numberify>wget<a class="anchor ms-1" href="#wget"></a></h2>
<p>Los gehts mit wget:</p>
<pre><code>wget --recursive --domains=wiki.natenom.com --html-extension --page-requisites --convert-links --no-parent -R &quot;*action=*&quot; -R &quot;*printable=*&quot; -R &quot;*oldid=*&quot; -R &quot;*title=Talk:*&quot; -R &quot;*limit=*&quot; &quot;https://wiki.natenom.de/w/Main_Page&quot;
</code></pre>
<p>Erklärung der Parameter:</p>
<blockquote>
<pre>--recursive</pre>
</blockquote>
<p>Das ganze Wiki soll heruntergeladen werden.</p>
<blockquote>
<pre>--domains=wiki.natenom.com</pre>
</blockquote>
<p>Es sollen nur URLs von der Domain des Wikis heruntergeladen werden.</p>
<blockquote>
<pre>--html-extension</pre>
</blockquote>
<p>Alle URLs werden in Dateien mit .html am Ende lokal abgespeichert, aus „https://wiki.natenom.de/w/Blaseite“ wird w/Blaseite.html</p>
<blockquote>
<pre>--convert-links</pre>
</blockquote>
<p>Alle internen Links werden so konvertiert, dass auf die jeweiligen relativen .html-Dateien verlinkt wird, statt auf Originalwebseite.</p>
<blockquote>
<pre>-R ...</pre>
</blockquote>
<p>Überspringt URLs, die bestimmte Strings enthalten, z. B. den Namensraum Talk und weitere.</p>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content"><p>Wenn es Probleme gibt und eine Meldung in der Form <code>no follow attribute found</code>, dann benötigt man zusätzlich noch diesen Parameter:</p>
<pre><code>-erobots=off
</code></pre>
</div>
</div>



<h2 id="ein-archiv-mit-der-ganzen-webseite" data-numberify>Ein Archiv mit der ganzen Webseite<a class="anchor ms-1" href="#ein-archiv-mit-der-ganzen-webseite"></a></h2>
<p>Nach dem Herunterladen des Wikis gibt es im aktuellen Verzeichnis ein neues Verzeichnis mit dem Namen „wiki.natenom.com“.</p>
<p>Dieses wird gepackt und dann auf den Server hochgeladen und ersetzt in Zukunft die dynamische Variante des Wikis.</p>
<p>Für mein Wiki ist das komplette Archiv gerade mal ~60MiB groß.</p>

<h2 id="weiterleitungen-einrichten-damit-links-von-draußen-weiterhin-funktionieren" data-numberify>Weiterleitungen einrichten, damit Links von draußen weiterhin funktionieren<a class="anchor ms-1" href="#weiterleitungen-einrichten-damit-links-von-draußen-weiterhin-funktionieren"></a></h2>
<p>wget hat im erstellen Archiv bereits alle heruntergeladenen URLs in Dateien mit der Endung .html umbenannt und alle vorhandenen Wiki-internen Verlinkungen angepasst. D. h. im fertigen, statischen Wiki enden alle URLs (außer Bilder) auf „.html“.</p>
<p>Wenn jedoch jemand von „außen“ über einen Link auf mein Wiki kommt, würde er ohne die Endung .html keine URL mehr abrufen können, daher muss man sich selbst darum kümmern, dass solche URLs weitergeleitet werden.</p>
<p>Dafür benötigt man eine RewriteRule:</p>
<blockquote>
<pre>Options +FollowSymlinks
</blockquote>
<p>RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !.html$
RewriteRule w/(.*) w/$1.html [R=302,L]</pre></p>
<p>Da es unterhalb von /w/ nur Seiten gibt und keine Grafiken, gibt es auch keine Probleme, dass versehentlich Bilder nach .html umgeleitet werden.</p>
<p>Alle anderen RewriteRules werden aus der alten Konfiguration gelöscht.</p>
<p>Für die anfangs erwähnten 301-Weiterleitungen bereits früher verschobener Inhalte musste ich jetzt noch die URLs anpassen, damit diese auf .html reagieren und diese entsprechend in die neue .htaccess-Datei des statischen Wikis übernehmen.</p>
<p>Z. B. wurde aus:</p>
<blockquote>
<pre>RedirectMatch permanent ^/w/Android$ https://wikiarchiv.natenom.de/en/android</pre>
</blockquote>
<p>dieses hier:</p>
<blockquote>
<pre>RedirectMatch permanent ^/w/Android\.html$ https://wikiarchiv.natenom.de/en/android</pre>
</blockquote>

<h2 id="startseite-des-wikis-verfügbar-machen" data-numberify>Startseite des Wikis verfügbar machen<a class="anchor ms-1" href="#startseite-des-wikis-verfügbar-machen"></a></h2>
<p>Jetzt sollte man noch einrichten, dass man die Startseite des Wikis auch dann erhält, wenn man auf die Hauptseite aufruft. Dies erledigt man am besten per Weiterleitung, weil die Startseite sonst mehrfach existiert mit gleichem Content. Jedoch würden dann die relativen URLs nicht passen, weil das /w/ am Anfang fehlen würde.</p>
<p>Daher trägt man in die .htaccess noch ein:</p>
<blockquote>
<pre>RedirectMatch ^/$ /w/Main_Page.html
</blockquote>
<p></pre></p>

<h2 id="css-verfügbar-machen" data-numberify>CSS verfügbar machen<a class="anchor ms-1" href="#css-verfügbar-machen"></a></h2>
<blockquote>
<pre>cd /xxx/htdocs/
</blockquote>
<p>cp load.php?debug=false&amp;lang=en&amp;modules=ext.cite.styles%7Cmediawiki.legacy.commonPrint%2Cshared%7Cmediawiki.sectionAnchor%7Cmediawiki.skinning.interface%7Cskins.vector.styles&amp;only=styles&amp;skin=vector.css &ldquo;load.php%3Fdebug=false&amp;lang=en&amp;modules=ext.cite.styles%257Cmediawiki.legacy.commonPrint%252Cshared%257Cmediawiki.sectionAnchor%257Cmediawiki.skinning.interface%257Cskins.vector.styles&amp;only=styles&amp;skin=vector.css&rdquo;</pre></p>

<h2 id="sitemaps" data-numberify>Sitemaps<a class="anchor ms-1" href="#sitemaps"></a></h2>
<p>In meinem Fall musste auch noch das Verzeichnis mit den Sitemaps kopiert werden.</p>

<h2 id="was-nicht-funktioniert" data-numberify>Was nicht funktioniert<a class="anchor ms-1" href="#was-nicht-funktioniert"></a></h2>
<p>Bis auf wenige Seiten sieht alles aus, wie es soll. Hier ist die Liste aller Seiten im Wiki, falls jemand etwas bestimmtes sucht. Die Suche selbst funktioniert natürlich nicht mehr, so wie auch alles andere, was dynamisch generiert wurde, wie z. B. der Namensraum Talk.</p>
<p>Die richtigen Seiten mit Inhalten sind aber alle verfügbar und das war mein Ziel.</p>

<h2 id="informieren" data-numberify>Informieren<a class="anchor ms-1" href="#informieren"></a></h2>
<p>Für mögliche 404 Fehler im jetzt statischen Wiki habe ich ein eigenes ErrorDocument für den Webserver erstellt, das kurz die Situation erklärt, damit der Besucher weiss, wieso es viele URLs nicht mehr gibt.</p>
<p>Die Datei heißt 404.html und über diese Direktive kann man sie aktivieren:</p>
<blockquote>
<pre>ErrorDocument 404 /404.html</pre>
</blockquote>
<p>Navigiert man zu einer URL, die es nicht mehr gibt, dann sieht man das Folgende:</p>
<p><a  href="/wp-content/uploads/2017/10/wiki.natenom.com_404_errordocument.png"><img loading="lazy" class="alignnone wp-image-40116 size-large" src="/wp-content/uploads/2017/10/wiki.natenom.com_404_errordocument-600x166.png" alt="" srcset="/wp-content/uploads/2017/10/wiki.natenom.com_404_errordocument-600x166.png 600w, /wp-content/uploads/2017/10/wiki.natenom.com_404_errordocument-150x42.png 150w, /wp-content/uploads/2017/10/wiki.natenom.com_404_errordocument-300x83.png 300w, /wp-content/uploads/2017/10/wiki.natenom.com_404_errordocument-768x212.png 768w, /wp-content/uploads/2017/10/wiki.natenom.com_404_errordocument.png 1012w" sizes="(max-width: 474px) 100vw, 474px" /></a></p>
<p>Das lässt sich auch in schön machen, aber mir reicht es aus.</p>

<h2 id="das-wars-dann-mit-mediawiki" data-numberify>Das wars dann mit MediaWiki<a class="anchor ms-1" href="#das-wars-dann-mit-mediawiki"></a></h2>
<p>Jetzt muss ich mich nicht mehr um unregelmäßige Updates meines nicht weiter geführten Wikis auf MediaWiki Basis kümmern und muss mir auch keine Sorgen machen, dass es irgendwann eine Sicherheitslücke geben könnte.</p>
<p>Nochmal zur Klarstellung: MediaWiki ist eine tolle Software und man kann sehr viel damit machen. Aus meiner Sicht ist es für einen einzelnen Menschen administrativ aber zu komplex. Deshalb habe ich mich lieber wieder auf mein DokuWiki  unter [wiki.natenom.de][2] konzentriert.</p>
<p>Perfekt :)</p>]]></content:encoded><enclosure url="https://natenom.de/2017/10/wie-man-ein-dynamisches-mediawiki-in-eine-statische-webseite-nur-html-dateien-umwandeln-kann/wiki.natenom.com_main_page-cover-featured.png" length="103722" type="image/png"/></item><item><title>Ab sofort keine Piwik-Statistikerfassung mehr auf meinen Webseiten</title><link>https://natenom.de/2017/03/ab-sofort-keine-piwik-statistikerfassung-mehr-auf-meinen-webseiten/</link><pubDate>Fri, 31 Mar 2017 11:37:05 +0000</pubDate><guid>https://natenom.de/2017/03/ab-sofort-keine-piwik-statistikerfassung-mehr-auf-meinen-webseiten/</guid><description>&lt;p>Piwik ist ein Tool zur Erzeugung von Zugriffsstatistiken für Webseiten. Es ist eine selbst gehostete Alternative für z. B. Google Analytics. Man kann bei Piwik selbst einstellen, wieviel Privatsphäre man haben will, z. B. bei der Speicherung von kompletten oder nur gekürzten IP-Adressen oder gar keinen.&lt;/p>
&lt;p>Ich habe 2010 eine eigene Piwik-Installation aufgesetzt und nutze es seitdem auf allen meinen Webseiten.&lt;/p></description><content:encoded><![CDATA[<p>Piwik ist ein Tool zur Erzeugung von Zugriffsstatistiken für Webseiten. Es ist eine selbst gehostete Alternative für z. B. Google Analytics. Man kann bei Piwik selbst einstellen, wieviel Privatsphäre man haben will, z. B. bei der Speicherung von kompletten oder nur gekürzten IP-Adressen oder gar keinen.</p>
<p>Ich habe 2010 eine eigene Piwik-Installation aufgesetzt und nutze es seitdem auf allen meinen Webseiten.</p>
<p>Anfänglich war es für mich ein sehr gutes Werkzeug, weil man damals noch sehen konnte, welche Suchbegriffe ein Besucher bei Google verwendet hat, um auf meinem Webseiten herauszukommen. Seit Google https als Voreinstellung verwendet sieht man diese Begriffe jedoch nicht mehr.</p>
<p><a  class='urlextern'  href="http://piwik.org/">Piwik</a> ist immer noch ein tolles Werkzeug und man kann viele andere Daten sehen, z. B. die meist verwendete Auflösung, Gerätetypen und vieles mehr.</p>
<p>Aber seit der genannten Änderung von Google konnte ich aus Piwik keine wirklich relevanten Dinge mehr für mich herauslesen.</p>
<p>Ich habe es aber weiterhin laufen lassen, weil es zur Befriedigung der eigenen Neugierde oder für ein paar Zahlenspiele immer mal wieder schön ist. Aber wirklich aussagekräftige Daten sind das alles nicht. Schließlich weiss man nie, wie groß der Anteil der Besucher ist, die Piwik blockieren.</p>
<p>Ich habe mich in der letzten Zeit immer mal wieder mit dem Thema und ob der Notwendigkeit von Piwik für mich auseinandergesetzt und mich heute letztlich dazu entschieden, die Piwik-Einbindung von allen meinen Webseiten zu entfernen.</p>]]></content:encoded></item><item><title>gpEasy (PHP) durch Hugo (statisches HTML) ersetzt</title><link>https://natenom.de/2015/12/gpeasy-php-durch-hugo-statisches-html-ersetzt/</link><pubDate>Thu, 10 Dec 2015 13:05:11 +0000</pubDate><guid>https://natenom.de/2015/12/gpeasy-php-durch-hugo-statisches-html-ersetzt/</guid><description><![CDATA[<p>Ich hatte erst vor ein paar Wochen geschrieben, dass auf meiner Webseite <a  class='urlextern'  href="https://www.natenom.com">www.natenom.com</a> <a  href="/2015/10/gpeasy-angenehmes-schlankes-cms-ohne-datenbank-in-php/">ein gpEasy</a> läuft.</p>
<p>Auf Dauer war ich aber nicht davon überzeugt PHP für eine Webseite zu verwenden, die nur aus statischen Inhalten besteht.</p>]]></description><content:encoded><![CDATA[<p>Ich hatte erst vor ein paar Wochen geschrieben, dass auf meiner Webseite <a  class='urlextern'  href="https://www.natenom.com">www.natenom.com</a> <a  href="/2015/10/gpeasy-angenehmes-schlankes-cms-ohne-datenbank-in-php/">ein gpEasy</a> läuft.</p>
<p>Auf Dauer war ich aber nicht davon überzeugt PHP für eine Webseite zu verwenden, die nur aus statischen Inhalten besteht.</p>
<p>Daher wird <a  class='urlextern'  href="https://www.natenom.com">www.natenom.com</a> jetzt offline auf meinem Rechner mittels <a  class='urlextern'  href="https://gohugo.io/">Hugo</a> erzeugt und anschließend hochgeladen. Man kann diesen Vorgang auch direkt auf dem Server ausführen, aber das ist in meinem Fall nicht notwendig; es ändert sich dort so gut wie niemals etwas :)</p>
<p>Es wird das Thema <a  class='urlextern'  href="https://github.com/zyro/hyde-x">hyde-x</a> verwendet.</p>
<p>So sieht die Seite auf dem Desktop aus:<figure class="wp-block-image"></p>
<p><a href="/wp-content/uploads/2015/12/www.natenom.com_hugo_on_desktop.png" rel="attachment wp-att-33880"><img loading="lazy" src="/wp-content/uploads/2015/12/www.natenom.com_hugo_on_desktop-600x424.png" alt="www.natenom.com_hugo_on_desktop" class="wp-image-33880" srcset="/wp-content/uploads/2015/12/www.natenom.com_hugo_on_desktop-600x424.png 600w, /wp-content/uploads/2015/12/www.natenom.com_hugo_on_desktop-150x106.png 150w, /wp-content/uploads/2015/12/www.natenom.com_hugo_on_desktop-300x212.png 300w, /wp-content/uploads/2015/12/www.natenom.com_hugo_on_desktop-768x543.png 768w, /wp-content/uploads/2015/12/www.natenom.com_hugo_on_desktop.png 1281w" sizes="(max-width: 600px) 100vw, 600px" /></a></figure></p>
<p>Das Design ist responsive und erscheint so auf einem Android-Gerät:<figure class="wp-block-image"></p>
<p><a href="/wp-content/uploads/2015/12/www.natenom.com_hugo_on_android_1.png" rel="attachment wp-att-33878"><img loading="lazy" src="/wp-content/uploads/2015/12/www.natenom.com_hugo_on_android_1-584x1024.png" alt="www.natenom.com_hugo_on_android_1" class="wp-image-33878" srcset="/wp-content/uploads/2015/12/www.natenom.com_hugo_on_android_1-584x1024.png 584w, /wp-content/uploads/2015/12/www.natenom.com_hugo_on_android_1-85x150.png 85w, /wp-content/uploads/2015/12/www.natenom.com_hugo_on_android_1-171x300.png 171w, /wp-content/uploads/2015/12/www.natenom.com_hugo_on_android_1.png 742w" sizes="(max-width: 584px) 100vw, 584px" /></a></figure> <figure class="wp-block-image"><a href="/wp-content/uploads/2015/12/www.natenom.com_hugo_on_android_2.png" rel="attachment wp-att-33879"><img loading="lazy" src="/wp-content/uploads/2015/12/www.natenom.com_hugo_on_android_2-584x1024.png" alt="www.natenom.com_hugo_on_android_2" class="wp-image-33879" srcset="/wp-content/uploads/2015/12/www.natenom.com_hugo_on_android_2-584x1024.png 584w, /wp-content/uploads/2015/12/www.natenom.com_hugo_on_android_2-85x150.png 85w, /wp-content/uploads/2015/12/www.natenom.com_hugo_on_android_2-171x300.png 171w, /wp-content/uploads/2015/12/www.natenom.com_hugo_on_android_2.png 742w" sizes="(max-width: 584px) 100vw, 584px" /></a></figure></p>
<p>Ein Kontaktformular gibt es daher nicht mehr, aber es gibt ja andere Kontaktmöglichkeiten.</p>]]></content:encoded></item><item><title>gpEasy – Angenehmes, schlankes CMS ohne Datenbank in PHP</title><link>https://natenom.de/2015/10/gpeasy-angenehmes-schlankes-cms-ohne-datenbank-in-php/</link><pubDate>Tue, 27 Oct 2015 16:00:46 +0000</pubDate><guid>https://natenom.de/2015/10/gpeasy-angenehmes-schlankes-cms-ohne-datenbank-in-php/</guid><description>&lt;p>Das hat mir kürzlich jemand empfohlen, danke dafür.&lt;/p>
&lt;p>Man benötigt keine Datenbank und die Bearbeitung der Inhalte geschieht per WYSIWYG direkt innerhalb der Webseite.&lt;/p></description><content:encoded><![CDATA[<p>Das hat mir kürzlich jemand empfohlen, danke dafür.</p>
<p>Man benötigt keine Datenbank und die Bearbeitung der Inhalte geschieht per WYSIWYG direkt innerhalb der Webseite.</p>
<p>Auf der <a  class='urlextern'  href="http://gpeasy.com/">Projektseite</a> gibt es viele verschiedene <a  class='urlextern'  href="http://gpeasy.com/Special_Addon_Themes">Themes</a> und auch <a  class='urlextern'  href="http://gpeasy.com/Special_Addon_Plugins">Plugins</a>.</p>
<p>Habe das verwendet, um meine Startseite auf <a  class='urlextern'  href="https://www.natenom.com">www.natenom.com</a> endlich ordentlich zu gestalten; vorher war das selbst geschriebenes HTML.</p>
<p>Aktuell verwende ich auf meiner Seite  das Thema namens <a  class='urlextern'  href="http://gpeasy.com/Themes/265_Slate">Slate</a>.</p>
<p>Hier ein Screenshot vom WYSIWYG-Editor:<figure class="wp-block-image"></p>
<p><a  href="/wp-content/uploads/2015/09/gpeasy_inline_editing.png"><img loading="lazy" src="/wp-content/uploads/2015/09/gpeasy_inline_editing-600x337.png" alt="gpeasy_inline_editing" class="wp-image-33217" srcset="/wp-content/uploads/2015/09/gpeasy_inline_editing-600x337.png 600w, /wp-content/uploads/2015/09/gpeasy_inline_editing-150x84.png 150w, /wp-content/uploads/2015/09/gpeasy_inline_editing-300x169.png 300w, /wp-content/uploads/2015/09/gpeasy_inline_editing.png 1252w" sizes="(max-width: 600px) 100vw, 600px" /></a></figure></p>
<p>Passt :)</p>]]></content:encoded></item><item><title>RSS-Bridge – Feeds für Webseiten, die keine haben oder haben wollen</title><link>https://natenom.de/2015/08/rss-bridge-feeds-fuer-webseiten-die-keine-haben-oder-haben-wollen/</link><pubDate>Wed, 05 Aug 2015 15:00:48 +0000</pubDate><guid>https://natenom.de/2015/08/rss-bridge-feeds-fuer-webseiten-die-keine-haben-oder-haben-wollen/</guid><description>&lt;p>Mit dem in PHP implementierten Projekt namens RSS-Bridge erhält man auf dem eigenen Webserver eigene Feeds für Webseiten/Projekte, die entweder keine haben oder keine haben wollen, wie z. B. Google Plus.&lt;/p></description><content:encoded><![CDATA[<p>Mit dem in PHP implementierten Projekt namens RSS-Bridge erhält man auf dem eigenen Webserver eigene Feeds für Webseiten/Projekte, die entweder keine haben oder keine haben wollen, wie z. B. Google Plus.</p>
<h2 id="formate" data-numberify>Formate<a class="anchor ms-1" href="#formate"></a></h2>
<p>Es werden verschiedene Feeds (Atom, RSS, HTML, JSON, Plaintext) angeboten. Wird ein solcher Feed abgerufen, arbeitet im Hintergrund eine sogenannte Brücke, die die Suchfunktion der entsprechenden Webseite abruft.</p>

<h2 id="installation" data-numberify>Installation<a class="anchor ms-1" href="#installation"></a></h2>
<p>Zum Installieren entpackt man das Projektarchiv auf dem eigenen Webserver, fertig. Es werden PHP 5.4 und OpenSSL benötigt.</p>

<h2 id="einen-feed-generieren-lassen" data-numberify>Einen Feed generieren lassen<a class="anchor ms-1" href="#einen-feed-generieren-lassen"></a></h2>
<p>Ruft man die URL des abgelegten Projektverzeichnisses auf, so erhält man eine Liste mit Forumlaren aller aktivierten Brücken:</p>
<p><a  href="/wp-content/uploads/2015/06/rss-bridge.png"><img loading="lazy" class="alignnone size-large wp-image-32849" src="/wp-content/uploads/2015/06/rss-bridge-600x612.png" alt="rss-bridge" srcset="/wp-content/uploads/2015/06/rss-bridge-600x612.png 600w, /wp-content/uploads/2015/06/rss-bridge-147x150.png 147w, /wp-content/uploads/2015/06/rss-bridge-294x300.png 294w, /wp-content/uploads/2015/06/rss-bridge.png 690w" sizes="(max-width: 474px) 100vw, 474px" /></a></p>
<p>Hier gibt man die notwendigen Daten ein, klickt auf das gewünschte Format und wird dann direkt zum eigenen Feed weitergeleitet, den man so in seinen News-Reader eintragen kann.</p>
<p>Für mich interessante Brücken sind:</p>
<ul>
<li>Bandcamp</li>
<li>DuckDuckGo</li>
<li>GooglePlus</li>
<li>SoundCloud</li>
<li>Twitter</li>
<li>Youtube</li>
</ul>
<p>Gerade letzteres kann ich seit längerem nicht mehr nutzen, seit Youtube die alte API deaktiviert hat.</p>
<p>Insgesamt gibt es aktuell ca. 100 verschiedene Brücken.</p>

<h2 id="o" data-numberify>\o/<a class="anchor ms-1" href="#o"></a></h2>
<p>Ein sehr schönes Projekt :)</p>
<p>Die Projektseite <a  class='urlextern'  href="https://github.com/sebsauvage/rss-bridge">findet sich hier</a>.</p>]]></content:encoded></item><item><title>Apache anweisen, weniger Informationen zu senden</title><link>https://natenom.de/2012/04/apache-anweisen-weniger-informationen-zu-senden/</link><pubDate>Mon, 30 Apr 2012 14:03:25 +0000</pubDate><guid>https://natenom.de/2012/04/apache-anweisen-weniger-informationen-zu-senden/</guid><description>&lt;p>Habe gestern ein paar Dinge mit Apache ausprobiert und &lt;a title="http://deltachaos.de" href="http://deltachaos.de" target="_self">Deltachaos&lt;/a> hat mich währenddessen darauf hingewiesen, dass der Server unnötige Informationen liefert.&lt;/p></description><content:encoded><![CDATA[<p>Habe gestern ein paar Dinge mit Apache ausprobiert und <a title="http://deltachaos.de" href="http://deltachaos.de" target="_self">Deltachaos</a> hat mich währenddessen darauf hingewiesen, dass der Server unnötige Informationen liefert.</p>
<p>Die Direktive <a title="http://httpd.apache.org/docs/current/mod/core.html#serversignature" href="http://httpd.apache.org/docs/current/mod/core.html#serversignature" target="_self">ServerSignature</a> von Apache war mir bekannt und bereits auf Off gestellt; dadurch sendet der Server nicht seine Version bei z.B. Verzeichnislisten oder Fehlerseiten.</p>
<p>Es werden aber auch im HTTP-Header Versionsinformationen von Apache <em>(Server: xxx)</em> und PHP <em>(X-Powered-By: xxx)</em> gesendet.<br>
Mit folgenden Änderungen erreicht man, dass Apache im Header nur noch „Server: Apache“ einträgt und „X-Powered-By“ ganz weglässt:</p>
<ol>
<li>„<a title="http://httpd.apache.org/docs/current/mod/core.html#servertokens" href="http://httpd.apache.org/docs/current/mod/core.html#servertokens" target="_self">ServerTokens</a> ProductOnly“ in die Apache-Config eintragen</li>
<li>„<a title="http://www.php.net/manual/en/ini.core.php#ini.expose-php" href="http://www.php.net/manual/en/ini.core.php#ini.expose-php" target="_self">expose_php</a> = Off“ in die entsprechende php.ini eintragen, z.B. /etc/php5/apache2/php.ini unter Debian.</li>
<li>Apache neustarten mit: apache2ctl graceful</li>
</ol>
<p>Fertig.</p>]]></content:encoded></item></channel></rss>