Automatische Vorschläge beim Suchen in WordPress mit ElasticPress auf Apache

Das ElasticPress-Plugin ermöglicht die Anbindung eines Elasticsearch-Servers, um beispielsweise die Ergebnisse der WordPress-Suche nach Relevanz anzuzeigen. Daneben bringt das Plugin noch ein paar weitere Funktionen mit, unter anderem Autosuggest für die Suche, also das Anzeigen von Ergebnissen beim Tippen im Suchfeld. Hier zeige ich, wie sich das auf einem Apache-Server ohne Zugriff auf die httpd.conf-Datei umsetzen lässt.

Voraussetzungen

Voraussetzungen für die Umsetzung sind:

  • Ein Elasticsearch-Server. Ich nutze dafür SearchBox Elasticsearch auf Heroku mit der Elasticsearch-Version 6.2.1.
  • Einen Elasticsearch-Endpunkt, der nur Lesezugriff hat (sonst kann später jeder den Endpunkt auch schreibend nutzen, da er über die Entwicklertools von jedem herausgefunden werden kann)! Bei Heroku mit SearchBox geht das über das Anlegen eines Access Key mit Read-Only-Rechten.
  • Das mit eurem Elasticsearch-Server verbundene ElasticPress-Plugin.
  • Natürlich ein Apache-Webserver.

Der hier beschriebene Weg wurde mit der genannten Elasticsearch-Version 6.2.1 und ElasticPress 2.5.2 auf einem Uberspace 7 (Apache 2.4.6 auf CentOS) getestet.

Die Umsetzung

Das Rumprobieren

In der Readme des veralteten GitHub-Repos zu dem Autosuggest-Plugin (veraltet, da das Plugin inzwischen direkt mit im ElasticPress-Repo ist) steht, wie die nginx-Konfiguration angepasst werden muss, damit das Feature funktioniert. Nun nutzt Uberspace 7 zwar nginx, ich habe aber natürlich keinen Zugriff auf die Konfigurationsdatei des Servers – es bleibt (soweit ich weiß) nur die Anpassung via .htaccess.

Also habe ich versucht, die Regeln für eine .htaccess umzuschreiben, hatte dabei aber nicht viel Glück. Zur Sicherheit habe ich im ElasticPress-Repo mal nachgefragt, ob das denn theoretisch mit Apache möglich sei, und weiterprobiert, nachdem das mit einem Hinweis auf Proxypass bejaht wurde (wofür es aber Zugriff auf die httpd.conf-Datei bräuchte, den ich natürlich auch nicht habe). Nach einigem Probieren und einem 500er, weil eventuell irgendwelche Proxy-Untermodule nicht geladen sind, habe ich Uberspace angeschrieben. Die Antwort: das wird so leider nicht funktionieren, da SSL mit einem Reverse-Proxy und nicht direkt mit Apache umgesetzt wird (ich hatte zu dem Zeitpunkt die https-Version des Elasticsearch-Endpunkts getestet). Und das war letztlich der entscheidende Hinweis, der meinen Ansatz dann endlich hat funktionieren lassen.

Die Lösung

Ich kenne mich mit nginx nicht aus, habe aus der Readme aber soviel gezogen, dass ein Endpunkt der eigenen Site (beispielsweise /es-search) auf den Elasticsearch-Endpunkt zeigen muss. Bei der Heroku-Lösung ist es so, dass der Elasticsearch-Endpunkt über Basic Auth geschützt ist – die URL des Read-Only-Access-Keys sieht beispielhaft so aus:

http://user:password@example.com
Code-Sprache: Bash (bash)

Das können wir in die .htaccess aber nicht einfach als Weiterleitungsziel eintragen – die Anmeldung würde nicht funktionieren. Bei serverfault.com bin ich auf die Lösung gestoßen: der Authorization-Header wird vorher mit den entsprechenden Daten gesetzt und anschließend einfach als Weiterleitungsziel die URL des Endpunkts gesetzt, ohne darin Nutzer und Passwort anzugeben.

Die komplette Lösung sieht so aus:

SetEnvIf Request_URI ^/es-search$/* ADD_ELASTICSEARCH_BASIC_AUTH RequestHeader set Authorization "Basic XXXXXXXXXXXXXXXXXX" env=ADD_ELASTICSEARCH_BASIC_AUTH RewriteRule ^es-search$ http://gloin-eu-west-1.searchly.com/indexName/post/_search [P]
Code-Sprache: Bash (bash)

Für Aufrufe von /es-search setzen wir die Anmeldedaten und den Header und führen in der dritten Zeile eine Weiterleitung unseres Endpunkts auf die Elasticsearch-URL aus. Das XXXXXXXXXXXXXXXXXX in Zeile 2 muss durch den Base64-kodierten user:password-String ersetzt werden. Das geht auf Linux, Mac und dem Windows Subsystem for Linux so (Lösung ebenfalls aus der serverfault.com-Antwort – user und pass müsst ihr natürlich auf eure Werte anpassen):

echo -n 'user:pass' | openssl base64
Code-Sprache: Bash (bash)

Die Adresse http://gloin-eu-west-1.searchly.com/indexName/post/_search müsst ihr durch die URL eures Anbieters ersetzen und den Indexnamen ändern. Ich musste hier die http-URL nehmen, da Uberspace wie geschrieben SSL über einen Reverse-Proxy umsetzt.

Nun müsst ihr den gewählten Endpunkt (also hier /es-search) noch in den ElasticPress-Einstellungen für die Autosuggest-Funktion eintragen, die Funktion aktivieren und könnt euch dann hoffentlich über eine funktionierende Vorschlagfunktion bei der Suche freuen 🎉

Der nächste Schritt wird bei mir die Verfeinerung sein, sodass zum Beispiel nicht nur der Titel durchsucht wird, sondern auch der Inhalt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert