Montag, 6. Februar 2017
[*]

WordPress-Updates vergessen .htaccess

, 23:31

Nachdem das Social Plugin von Mailchimp, das hier früher so schön die Reaktionen von Facebook und Twitter als Kommentare ins Blog importiert hat, zu funktionieren aufgehört hatte, habe ich mich ein wenig mit IndieWeb beschäftigt. Lange noch nicht tiefgehend genug, aber die Plugins funktionierten erstmal ganz gut und brachten meinem Blog Webmentions bei (wie z.B. hier zu sehen ist).

Doch am vorletzten Wochenende habe ich ein paar Updates installiert (sowohl für WordPress als auch für das Webmentions-Plugin), und am Anfang der letzten Woche kamen dann gar keine Webmentions mehr an. Bei Bridgy fand ich erstmal nur nichtssagende Fehlermeldungen.

Auf meinen frustrierten Tweet meldeten sich aber sofort freundliche Helfer, darunter der Autor des Webmentions-Plugins, und gemeinsam konnten wir der Ursache auf die Spur kommen: tatsächlich hatte Bridgy eine ordentliche Logdatei, aus der hervorging, dass mein Apache einen Serverfehler 500 zurückgibt:

0.1.0.2 - - [30/Jan/2017:00:42:03 -0800] "POST /_ah/queue/propagate HTTP/1.1" 304 1071 "https://brid.gy/retry" "AppEngine-Google; (+http://code.google.com/appengine)"

2017-01-30 08:42:00.032720 D Params: NestedMultiDict([('response_key', u'aglzfmJy...')])
2017-01-30 08:42:00.937850 I Source: Thomas Renger (Facebook) 10153250416376118, http://brid-gy.appspot.com/facebook/10153250416376118
2017-01-30 08:42:01.030590 I Created by this poll: http://brid-gy.appspot.com/log?start_time=1485727919&key=aglzfmJyaWQtZ3lyIwsSDEZhY2Vib29rUGFnZSIRMTAxNTMyNTA0MTYzNzYxMTgM
2017-01-30 08:42:01.130020 I Starting Response like tag:facebook.com,2013:10155005024956118_liked_by_10153108342655662 https://www.facebook.com/10153250416376118/posts/10155005024956118#liked-by-10153108342655662
2017-01-30 08:42:01.729090 I Webmention from https://brid-gy.appspot.com/like/facebook/10153250416376118/10155005024956118/10153108342655662 to https://dentaku.wazong.de/2017/01/29/digitale-albtraeume-teil-2/
2017-01-30 08:42:01.834260 I Using cached webmention endpoint u'W https dentaku.wazong.de': https://dentaku.wazong.de/wp-json/webmention/1.0/endpoint
2017-01-30 08:42:01.845109 I Sending...
2017-01-30 08:42:02.543940 W Error sending to endpoint: {'body': u'<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">\n<html><head>\n<title>500 Internal Server Error</title>\n</head><body>\n<h1>Internal Server Error</h1>\n<p>The server encountered an internal error or\nmisconfiguration and was unable to complete\nyour request.</p>\n<p>Please contact the server administrator,\n [no address given] and inform them of the time the error occurred,\nand anything you might have done that may have\ncaused the error.</p>\n<p>More information about this error may be available\nin the server error log.</p>\n<hr>\n<address>Apache/2.2.22 (Debian) Server at dentaku.wazong.de Port 80</address>\n</body></html>\n', 'code': '...', 'request': u'POST https://dentaku.wazong.de/wp-json/webmention/1.0/endpoint (with source=https://brid-gy.appspot.com/like/facebook/10153250416376118/10155005024956118/10153108342655662, target=https://dentaku.wazong.de/2017/01/29/digitale-albtraeume-teil-2/)', 'http_status': 500}
2017-01-30 08:42:02.544750 W Propagate task failed

Aber vorher war das doch auch gegangen. Was hatte sich also geändert?

Nun, in der neuen Version war der API-Endpunkt für Webmentions in den Namespace der WordPress-REST-API hinein verlegt (wo er auch logisch hin gehört). Nach einigem Experimentieren fanden wir aber heraus, dass die komplette REST-API auf meinem Server nicht funktionierte — und zwar bei allen Blogs. Im Errorlog sah das dann so aus:

[Mon Jan 30 10:09:56 2017] [error] [client 0.0.0.0] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
[Mon Jan 30 10:09:56 2017] [debug] core.c(3116): [client 0.0.0.0] r->uri = /wp-json/webmention/1.0/endpoint
[Mon Jan 30 10:09:56 2017] [debug] core.c(3122): [client 0.0.0.0] redirected from r->uri = /wp-json/webmention/1.0/endpoint
[Mon Jan 30 10:09:56 2017] [debug] core.c(3122): [client 0.0.0.0] redirected from r->uri = /wp-json/webmention/1.0/endpoint
[Mon Jan 30 10:09:56 2017] [debug] core.c(3122): [client 0.0.0.0] redirected from r->uri = /wp-json/webmention/1.0/endpoint
[Mon Jan 30 10:09:56 2017] [debug] core.c(3122): [client 0.0.0.0] redirected from r->uri = /wp-json/webmention/1.0/endpoint
[Mon Jan 30 10:09:56 2017] [debug] core.c(3122): [client 0.0.0.0] redirected from r->uri = /wp-json/webmention/1.0/endpoint
[Mon Jan 30 10:09:56 2017] [debug] core.c(3122): [client 0.0.0.0] redirected from r->uri = /wp-json/webmention/1.0/endpoint
...

Es brauchte einiges an weiterem Debugging um herauszufinden, was meine Installation von anderen unterschied: meine .htaccess-Datei stammte noch von der ursprünglichen WordPress-µ-2.9-Installation, in die ich die Blogs 2009 umgezogen habe. Die Unterschiede, die sich da über die Jahre ergeben haben, sind bei WordPress auch ordentlich dokumentiert, aber da steht leider nicht, dass mit den älteren Varianten einige neue Funktionen gar nicht … äääh … funktionieren.

Nachdem ich die zentralen Rewrite-Regeln von:

# add a trailing slash to /wp-admin
RewriteCond %{REQUEST_URI} ^.*/wp-admin$
RewriteRule ^(.+)$ $1/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . - [L]
RewriteRule  ^([_0-9a-zA-Z-]+/)?(wp-.*) $2 [L]
RewriteRule  ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

zu:

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L] 
RewriteRule ^(wp-(content|admin|includes).*) $1 [L] 
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L] 

„modernisiert“ hatte, funktionierte auch die REST-API. Und schon kamen die Webmentions wieder an.

Also Achtung! Überprüft auch Eure WordPress-Blogs mal, ob die .htaccess-Datei auf dem neuesten Stand ist, denn das Update aktualisiert sie nicht für Euch. Ruft mal ${euerblog}/wp-json/ auf und guckt, ob da ein JSON-String oder eine Fehlermeldung kommt.

Vielen Dank an @pfefferle für die Hilfe beim Debugging.

7 Reaktionen:

  1. Gravatar

    Tom Tinkerson hat diesen Artikel auf twitter.com geliked.

  2. Gravatar

    Kiki hat diesen Artikel auf twitter.com geliked.

  3. Gravatar

    Steffen Voß hat diesen Artikel auf facebook.com geliked.

  4. Gravatar

    Stefanie Beer hat diesen Artikel auf facebook.com geliked.

  5. Gravatar

    Die REST API hatte auch ein großes Sicherheitsloch (hat mit Deinem Problem nix zu tun. Nur so…) heise.de/security/meldu…

    via twitter.com

  6. Gravatar

    ah, jetzt hab ich den Vorgängertweet gesehen. Ist ja nett, dass Google das in der Webconsole anzeigt…

    via twitter.com

  7. Gravatar

    Christian Fischer hat diesen Artikel auf facebook.com geliked.

Kommentare willkommen