Server Error 500 bei YOURLS

  • Schönen Abend,


    ich habe ein überaus kurioses Problem, in meinen Augen: Ich habe zwei URL-Shortener hier bei Netcup unter zwei unterschiedlichen Domains: beispiel1.de und beispiel2.de

    Beide laufen mit YOURLS 1.7.3 (aktuellste) auf einem Webhosting Sommer 2019.


    Problem: bei beispiel2.de bekomme ich beim Aufruf jeglicher Short-URLs einen 500 Error, /admin und /pages sowie index.php funktionieren.

    Die Dateien von beispiel1.de und beispiel2.de sind identisch (abgesehen von den Datenbank-Infos in der config.php), ich habe auch schon alle Files gelöscht und von beispiel1.de rüber kopiert (und config.php wieder angepasst). Die Hosting- und PHP-Einstellungen sowie die Einstellungen für Apache & nginx sind ebenfalls identisch.

    Es gibt in meinen Augen absolut keinen Grund, warum bei einer Domain der Fehler auftritt, bei der anderen nicht. In den Protokollen, die man in Plesk abrufen kann, findet sich nur der 500er ohne jegliche Informationen, zumindest könnte ich keine finden.


    Alles, was die beiden Shortener unterscheidet, ist die Datenbank und dass beispiel1.de eine Inklusiv-Domain und beispiel2.de eine externe Domain ist, die aber vor einigen Tagen noch tadellos funktioniert hat. Ich habe überhaupt nichts verändert, seit es funktionierte das letzte mal, aber ein Blick in die Logs zeigt, dass schon seit etwas über einer Woche bei allen Short-URLs 500er auftreten.


    Vielleicht kann mir jemand helfen?

    Ich weiß es sind nicht viele Infos, aber fragt gerne, ich weiß nur wirklich nicht, was ich erzählen soll, weil ich gar nicht weiß, wo ich anfangen soll!


    Grüße,

    Twisterado

  • [..] aber ein Blick in die Logs zeigt, dass schon seit etwas über einer Woche bei allen Short-URLs 500er auftreten.

    Was genau steht im Error Log? Ein kleiner Auszug, gerade bei Auftritt des 500er-Fehlermeldung(en) wäre definitiv Interessant.



    Hast du zufällig unterschiedliche PHP Versionen eingestellt?

    Die Hosting- und PHP-Einstellungen sowie die Einstellungen für Apache & nginx sind ebenfalls identisch.

  • Hast du zufällig unterschiedliche PHP Versionen eingestellt?

    Ansonsten ist da wohl der Support zuständig.


    Hast du eine error.log Datei im Log Verzeichnis? Schau da mal rein

    Ist dieselbe PHP-Version.


    error.log scheint es nicht zu geben.


    Was genau steht im Error Log? Ein kleiner Auszug, gerade bei Auftritt des 500er-Fehlermeldung(en) wäre definitiv Interessant.

    Hier mal die letzten Paar Einträge aus dem "SSL/TLS-Zugriff für Apache":

    Code
    1. 123.456.789.0 - - [05/Sep/2019:22:03:29 +0200] "GET / HTTP/1.0" 302 372 "-" "User Agent gekürzt"
    2. 123.456.789.0 - - [05/Sep/2019:22:03:30 +0200] "GET /admin/ HTTP/1.0" 200 6380 "-" "User Agent gekürzt"
    3. 123.456.789.0 - - [05/Sep/2019:22:03:33 +0200] "GET /admin/ HTTP/1.0" 200 6375 "-" "User Agent gekürzt"
    4. 123.456.789.0 - - [05/Sep/2019:22:03:35 +0200] "GET / HTTP/1.0" 302 372 "-" "User Agent gekürzt"
    5. 123.456.789.0 - - [05/Sep/2019:22:03:36 +0200] "GET /offline HTTP/1.0" 200 610 "-" "User Agent gekürzt"
    6. 123.456.789.0 - - [05/Sep/2019:22:03:46 +0200] "GET /chat HTTP/1.0" 500 340 "-" "User Agent gekürzt"
    7. 123.456.789.0 - - [05/Sep/2019:22:03:57 +0200] "GET /admin/ HTTP/1.0" 200 6377 "-" "User Agent gekürzt"

    Den User Agent hab ich der Übersicht halber mal rausgenommen und natürlich die IP verändert.

    Wie gesagt /admin und index.php funktionieren, genauso /offline, was eine Datei im /pages Ordner ist. /chat ist ein Keysord für eine Short-URL, die nicht funktioniert.

  • Yourls unterstützt von Haus aus nur eine Domain pro Installation. Könnte es vielleicht daran liegen? Hast du die config von yourls pro Domain angepasst? Ansonsten wäre z.B. das Plugin „Allow Aliases“ hilfreich: https://github.com/YOURLS/awes…rls/blob/master/README.md

    Die beiden Shortener sind unabhängig voneinander, keine Aliase, beide greifen auf unterschiedliche DBs zu.


    Beide Shortener haben vor 2 Wochen auch noch einwandfrei funktioniert, nun auf einmal der eine nicht mehr.

  • error.log scheint es nicht zu geben.


    Hier mal die letzten Paar Einträge aus dem "SSL/TLS-Zugriff für Apache":

    Das scheint nur das access_log vom apache zu sein. Standardmäßig findest du die fraglichen Protokolldateien im Ordner logs/ diese sollten wie folgt lauten:


    error_log (apache)

    proxy_error_log (nginx)


    Könntest du zusätzlich noch deine .htaccess Datei posten und oder diese mit der der lauffähigen Version abgleichen?


    Falls du nginx als Proxy nutzen solltest, deaktiviere diese Funktion einmal und schau ob die 500er-Fehlermeldungen weiterhin auftreten.

  • error_log und proxy_error_log sind leer.


    .htaccess ist ebenfalls identisch, trotzdem:

    Auch wenn ich den oberen Teil rausnehme (der vorher auch funktioniert hat) und nur den YOURLS-Teil übrig lasse, ändert nichts.


    Die nginx-Proxy-Funktion kann ich deaktivieren und die 500er werden zu 404ern, weil die .htaccess nicht mehr abgefragt wird, wenn ich das richtig verstehe. Dann geben nämlich auch die /pages-Dateien einen 404er zurück, außer sie werden direkt aufgerufen.

  • Ansonsten ist da wohl der Support zuständig.

    Wenn du alles gleich eingestellt hast und es nicht funktioniert, solltest du den Support anschreiben.



    Du benutzt also beidesmal nginx und hast dort

    Code
    1. location / { try_files $uri $uri/ /yourls-loader.php$is_args$args; }

    eingetragen?


    Error 500 kann halt so ziemlich alles sein. Von Dateirechten (überprüft?), über ein fehlerhaftes Script (hast du wohl ausgeschlossen), hin zu backend Problemen (hier kann nur der Support helfen). Du kannst versuchen in der Konsole von Chrome (F12) Hinweise zu finden, wann der Aufruf fehlschlägt. Geht denn eine beliebiges anderes PHP Script auf der Domain? Es reicht eine phpinfo Seite:

    PHP
    1. <?php phpinfo(); ?>

    Wenn ja, kannst du im yourls script ein "die( 'it works' );" am Anfang einfügen und dann immer weiter nach unten verschieben, bis der Fehler auftritt 8) Weitere Debugmöglichkeiten fallen mir beim Webhosting nicht ein :/

  • error_log und proxy_error_log sind leer.

    In welche error_log Datei hast du geschaut? Es gibt mehrere.

    In meinem Webhosting beinhaltet /logs/error_log nur die Meldungen für die Default hosting... Domain. Im logs Ordner gibt es noch Unterordner pro Domain und darin weitere error_log Dateien, z.B.: /logs/example.com/error_log (gleiches gilt für proxy_error_log).

    Sind diese ebenfalls leer?

  • Vielen Dank für eure Vorschläge!

    Ich schaffe es leider es jetzt, mich wieder mit dem Thema auseinanderzusetzen.

    moritzh Ja, ich hab in beide reingeschaut, sind alle leer.


    Steini Ja, andere PHP-Skripte funktionieren.

    Die Console von Chrome sagt nichts.


    Ich hab das mit dem die('it works'); ausprobiert und habe tatsächlich etwas eingrenzen können, aber Sinn macht es in meinen Augen nicht.


    PHP: yourls-loader.php
    1. // Redirection:
    2. if( preg_match( "@^([$pattern]+)/?$@", $request, $matches ) ) {
    3. $keyword = isset( $matches[1] ) ? $matches[1] : '';
    4. $keyword = yourls_sanitize_keyword( $keyword );
    5. yourls_do_action( 'load_template_go', $keyword );
    6. require_once( YOURLS_ABSPATH.'/yourls-go.php' );
    7. exit;
    8. }

    Setze ich in der yourls-loader.php das die() vor die Zeile 37, wird es ausgegeben und kein 500er.

    Also weiter in der yourls-go.php

    PHP: yourls-go.php
    1. // URL found
    2. if( !empty( $url ) ) {
    3. yourls_redirect_shorturl($url, $keyword);
    4. // URL not found. Either reserved, or page, or doesn't exist
    5. } else {
    6. [...]
    7. }

    Setze ich hier das die() vor Zeile 21, wird es ausgegeben.

    Die Funktion yourls_redirect_shorturl() finde ich in der functions.php

    Hier funktioniert alles, wenn ich das die() vor Zeile 740 setze bzw. diese auskommentiere.

    Die Funktion yourls_log_redirected() finde ich weiter unten in der functions.php

    Hier tritt der Fehler in Zeile 897 auf. Wenn ich das Ergebnis der Zeile erst in eine Variable speichere und danach returne, funktioniert es trotzdem nicht, also muss der Fehler in der Funktion fetchAffected() liegen.

    Diese Funktion finde ich in der Datei ExtendedPdo.php

    PHP: ExtendedPdo.php
    1. public function fetchAffected($statement, array $values = array())
    2. {
    3. $sth = $this->perform($statement, $values);
    4. return $sth->rowCount();
    5. }

    Hier wird das die() ausgegeben, wenn ich es vor Zeile 307 setze. Wenn ich aber das Ergebnis der Zeile erst in eine Variable speichere, scheitert es erst beim return. Sprich ich kann rowCount() ausführen, ohne 500er, sobald das Ergebnis zurückgegeben wird, scheitert es.

    Eigentlich dürfte das ja nicht sein, denn es wird ja an die yourls_log_redirect() aus der functions.php zurückgegeben, die nur scheitert, wenn die Funktion fetchAffected ausgeführt wird, aber in der Funktion fetchAffected kann das Problem ja auch nicht liegen, wenn sie alles erfolgreich machen kann und es erst beim returnen scheitert.


    Ich hoffe es ist irgendwie nachvollziehbar, was ich gemacht habe!?

    Vielen Dank nochmal und schonmal für eure Unterstützung!

  • Puh, mit PHP kann ich nicht mehr weiterhelfen. Der Fehler tritt also auf, wenn die Logzeile geschrieben werden soll? Und wenn du das auskommentierst und nichts loggst, geht alles (also die Kommunikation mit der Datenbank funktioniert sonst)?

    In jedem Fall sollte es aber einen Eintrag in der error.log geben!

    Es könnte höchstens sein, dass YOURLS soweit läuft, dass es Fehlermeldungen unterdrückt(?)


    Benutzt du denn jetzt apache oder nginx (vielleicht habe ich das schon wieder übersehen, aber einmal redest du von den Apache logfiles und htaccess, einmal von nginx-proxy funktion?)?

    Bei Apache könntest du mit folgenden Einträgen in der htaccess die Ausgabefreudigkeit bei Fehlermeldungen etwas erhöhen, bzw. den Pfad zum error.log anpassen:


    EDIT:

    Wenn ich mir "YOURLS -> Troubleshooting first steps" anschaue, werden die Fehlermeldungen wohl tatsächlich unterdrückt:


    Wäre durchaus mal eine Option, das auszuprobieren ;-)

  • Steini vielen Dank nochmal auch für deine Hilfe!

    Ich habe das Problem lösen können, zumindest sieht es so aus.

    Nachdem leider auch mit deinen Tipps aus dem letzten Beitrag keine Fehler in der error_log aufgetaucht sind, habe ich es mit der Datenbank einer anderen YOURLS-Installation versucht, indem ich diese in der config.php angegeben habe. Auf einmal funktionierte das weiterleiten und loggen problemlos.

    Nach weiterer Recherche war scheinbar die log-Tabelle in der Datenbank beschädigt, ich weiß es nicht, die beiden wichtigeren, url- und options-Tabellen konnte ich behalten, die log-Tabelle hab ich neu erstellt und damit ist das Problem gelöst und alles funktioniert!