Wie erstelle ich eine URL in einem WordPress, die den Code 200 zurückgibt?

8

Dies ist erforderlich, da ich einen Load Balancer in GCP für eine WordPress-Instanz implementieren muss.

GCP leitet eine Anfrage nur an die WordPress-Instanz weiter, wenn sie den Gesundheitstest besteht.

Hier ist eine typische Definition eines Gesundheitsprüfungsbildschirms

Geben Sie hier die Bildbeschreibung ein

Es wird erwartet, dass der 'Anforderungspfad' 200 zurückgibt. Andernfalls wird das Zielsystem als ausgefallen betrachtet.

Wenn ich jedoch eine Seite in WordPress erstelle /index.php/newpage, gibt sie immer 301 zurück.

Während die WordPress-Site aktiv ist, besteht die Integritätsprüfung nicht.

Gibt es eine Möglichkeit, eine Seite in WordPress zu definieren, die 200 zurückgibt? Hoffentlich wird kein zusätzliches Plugin benötigt, da ich die Pflege eines zusätzlichen Plugins vermeiden möchte.

Der letzte Ausweg für mich ist das Hinzufügen einer URL zum PHP-Server, die 200 zurückgibt. Der Status dieser URL spiegelt jedoch möglicherweise nicht 100% den Zustand der WordPress-Site wider (der beispielsweise aufgrund eines MySQL-Problems ausfallen kann). Wenn es tatsächlich das letzte Mittel ist, wie kann es am besten umgesetzt werden? Ich bin nicht kompetent mit PHP-Entwicklung.

Die Version von WordPress ist 4.6.2

Anthony Kong
quelle
2
Warum verwenden Sie dafür nicht einfach die Stammseite der Website?
Tero Kilkanen

Antworten:

9

Sie können die Startseite Ihrer WordPress-Installation für die Integritätsprüfung verwenden. Dies ist der zuverlässigste Indikator dafür, dass die WordPress-Site verfügbar ist.

Tero Kilkanen
quelle
3
Die akzeptierte Antwort ist nicht klar genug, wenn es um die "Titelseite" geht. Man könnte annehmen, dass dies einfach durch Verwendung des Wurzelpfads dargestellt werden könnte /. Zumindest auf dem offiziellen Wordpress Docker-Container, den wir verwenden, wird jedoch eine 301-Umleitung ausgegeben. Verwenden Sie dazu /index.phpeinen 200-HTTP-Antwortcode , um dies zu umgehen.
Jacob Thomason
Es hängt davon ab, wie WordPress installiert wurde. Wenn benutzerfreundliche URLs korrekt konfiguriert sind, wird die /URL mit index.phpohne 301Weiterleitung verarbeitet. Ich habe keine Erfahrung mit dem offiziellen WordPress-Container. Die Klarstellung hat noch Verdienst, danke dafür!
Tero Kilkanen
3

Für das, was es wert ist, musste ich eine WordPress-Site in einem Container einrichten und eine Integritätsprüfung durchführen, um erfolgreich zu sein, bevor ich überhaupt Traffic darauf lenken konnte. Die Vorschläge für die "Startseite" funktionieren erst, nachdem WordPress über den Browser installiert wurde. Zuvor geben sie einen 302-Statuscode an zurück /wp-admin/install.php. Ich nudelte in den Containerordnern herum und entschied mich, sie /wp-includes/images/blank.gifals Pfad für die Gesundheitsprüfung zu verwenden. Dadurch konnte die Integritätsprüfung erfolgreich durchgeführt werden, und der Datenverkehr wurde zum Container weitergeleitet. Von dort aus habe ich WordPress über den Browser installiert und konnte den Pfad für die Integritätsprüfung wieder ändern /.

Anson Goldade
quelle
0

Obwohl dies ein alter Beitrag ist, wollte ich mich darauf einlassen, da dieses Thema immer noch relevant ist und die akzeptierte Antwort in meinem Anwendungsfall nicht ideal ist. Ich würde nicht vorschlagen, dass andere dies tun; speziell für ein stark frequentiertes System.

Mein Problem mit der akzeptierten Antwort ist, dass empfohlen wird, die Homepage als Gesundheitscheck zu verwenden. Abhängig von Ihrer Site könnte dies in Ordnung sein, aber ich sehe keine Notwendigkeit, dass die Datenbank bei einer Integritätsprüfung abgefragt wird. Selbst wenn die DB-Verbindung fehlschlägt, ist die Instanz technisch immer noch fehlerfrei. Wenn beispielsweise Ihr RDS-Cluster ausfällt, wird auf der Startseite ein DB-Fehler angezeigt, der einen anzeigt, 500sodass Sie Ihre automatische Skalierung ohne Notwendigkeit auslösen würden. Bei der Integritätsprüfung muss nur die App überprüft und sichergestellt werden, dass sie ordnungsgemäß eingerichtet ist.

Meine Homepage enthält viele Abfragen, und die Integritätsprüfung allein belastet den RDS-Cluster bei der Einrichtung mehrerer Instanzen unnötig. Ich könnte eine hellere Seite angeben, aber dies ist immer noch nicht ideal, da die Integritätsprüfung sicherstellen sollte, dass die Instanz ordnungsgemäß eingerichtet ist, und ich möchte nicht, dass jedem System, das ich hochfahre, eine projektspezifische Prüfung hinzugefügt wird. Obwohl es auch dafür Anwendungsfälle gibt.

Ich benutze diesen einfachen Gesundheitscheck ( _healthCheck.php):

<?php
/**
 * Check if basic WordPress structure is in place
 * This is to be used for load balancer health checks
 */

// Checks
define('WORDPRESS_CONFIG', __DIR__ . DIRECTORY_SEPARATOR . 'wp-config.php');
define('WORDPRESS_DIRECTORY', __DIR__ . DIRECTORY_SEPARATOR . 'wordpress');
define('WP_CONTENT_DIRECTORY', __DIR__ . DIRECTORY_SEPARATOR . 'wp-content');


// Health Check Flags
$_healthCheckStatus = true;
// Will stop the while loop
$_healthCheckCompleted = false;

// Just to be safe
try {
    // DoWhile loop here to simplify kicking out on a false $_healthCheckStatus
    do {
        // Check if wp-config exists
        if (!file_exists(WORDPRESS_CONFIG)) {
            $_healthCheckStatus = false;
        }

        // Make sure we have required directories
        $_healthCheckStatus = _dirIsValidAndNotEmpty(WORDPRESS_DIRECTORY);
        $_healthCheckStatus = _dirIsValidAndNotEmpty(WP_CONTENT_DIRECTORY);

        // Checks are complete, kick out the loop
        $_healthCheckCompleted = true; // Just say no to infinity and beyond
    } while (false === $_healthCheckCompleted && true === $_healthCheckStatus);
} catch (\Exception $e) {
    // Health check fails
    $_healthCheckStatus = false;
}

// If a bad healthcheck, return 404 to tell the load balancer we suck
if (false === $_healthCheckStatus) {
    header("HTTP/1.0 404 Not Found");
    ?>
    <html>
    <body><h1>Health is bad</h1></body>
    </html>
    <?php
    die();
} else {
    ?>
    <html>
    <body><h1>Health appears good</h1></body>
    </html>
    <?php
}

/**
 * Validates a directory and ensures it's not empty
 * @param string $dir
 * @return bool
 */
function _dirIsValidAndNotEmpty($dir) {
    // Make sure we have a directory
    if (is_dir($dir)) {
        // Make sure it's not empty
        $_dirIsNotEmpty = (new \FilesystemIterator($dir))->valid();
        if ($_dirIsNotEmpty) {
            return true;
        }
    }

    return false;
}

Ein paar Dinge zu beachten:

  • Ich installiere WordPress immer im wordpressVerzeichnis.
    • Dies macht es viel einfacher, ein Projekt in Git zu verwalten, da Sie das wordpressVerzeichnis einfach ignorieren können .
  • Da ich WordPress in einem eigenen Verzeichnis habe, verwende ich gerne mein eigenes wp-content, um das Projektmanagement zu vereinfachen.
  • Sie können dies leicht an Ihre Bedürfnisse anpassen.

Diese Integritätsprüfung überprüft nur das System, um sicherzustellen, dass es ordnungsgemäß eingerichtet ist. Die Datenbank muss nicht abgefragt werden, da dies für die Integritätsprüfung nicht erforderlich ist. Dies ist ein Konfigurationsproblem, das behoben werden sollte, bevor Sie Ihr System überhaupt einrichten.

Jeremy
quelle
0

Bearbeitet:

Ich habe /wp-admin/images/wordpress-logo.svg verwendet (in früheren Versionen funktionierte es mit /favicon.ico) Klingt eher nach einem Hack, aber wenn WordPress nicht funktioniert, wird ein 5xx-Fehler angezeigt, andernfalls 200 = bereits installiert, 200 = nicht installiert.

Radu Toader
quelle
Der Installationsassistent ist eigentlich eine 301-Umleitung. Es würde also scheitern, wenn es nicht eingerichtet würde
Jeremy