Newsletter 365tipů můžete číst zdarma. Placené předplatné je dobrovolná podpora, která pomáhá webu pokračovat.
Podpořit 365tipů

TIP#3272: Jak zabránit tomu, aby WordPress při výpadku databáze ukazoval install.php? (V2.0)

Občas se může stát, že hosting dočasně odstaví databázi. Třeba kvůli přetížení. WordPress se pak v některých případech může zachovat dost nešťastně: místo normální chybové stránky začne návštěvníkům ukazovat instalační obrazovku přes wp-admin/install.php.

Tohle na produkčním webu opravdu nechcete. Přes pár lety k tomu vznikl Co byste po instalaci WordPressu měli smazat či změnit? install.php – pozor ať nedopadnete špatně, ale řešení to nebylo až takové, jak by bylo potřeba. Takže je tu novější.

Řešení má dvě části.

1. Vytvořte vlastní stránku pro výpadek databáze

Do složky:

/wp-content/

vložte soubor:

db-error.php

Například s tímto obsahem:

<?php
http_response_code(503);
header('Content-Type: text/html; charset=utf-8');
header('Retry-After: 900');
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('X-Robots-Tag: noindex, nofollow');
?>
<!doctype html>
<html lang="cs"
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title>Web je dočasně nedostupný</title>
  <style>
    body {
      margin: 0;
      font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      background: #f5f7fb;
      color: #111827;
    }
    .wrap {
      max-width: 760px;
      margin: 12vh auto;
      padding: 32px;
      background: #fff;
      border-radius: 16px;
      box-shadow: 0 10px 30px rgba(0,0,0,.08);
    }
    h1 {
      margin-top: 0;
      font-size: 28px;
      line-height: 1.25;
    }
    p {
      font-size: 17px;
      line-height: 1.6;
    }
    .small {
      color: #6b7280;
      font-size: 14px;
    }
  </style>
</head>
<body>
  <main class="wrap">
    <h1>Web je dočasně nedostupný</h1>
    <p>Něco se na serveru dočasně pokazilo. Zkuste stránku za pár minut obnovit.</p>
    <p class="small">HTTP 503 – dočasný výpadek služby.</p>
  </main>
</body>
</html>

WordPress tento soubor použije ve chvíli, kdy se nedokáže připojit k databázi.

Důležité je hlavně tohle:

http_response_code(503);

Tím říkáte prohlížečům, robotům i případné cache, že jde o dočasný výpadek služby, ne o běžnou stránku.

2. Zablokujte instalační obrazovky ve .htaccess

Do .htaccess přidejte vlastní pravidla nad blok WordPressu. Nikdy je nedávejte mezi:

# BEGIN WordPress
# END WordPress

Tenhle blok si WordPress může přepisovat sám.

Nad něj dejte například:

# VLASTNI OCHRANY PRODUKCNIHO WEBU
<IfModule mod_rewrite.c>
RewriteEngine On
# Nikdy nezobrazovat instalacni obrazovku WordPressu na produkci
RewriteRule ^wp-admin/install\.php$ – [R=503,L]
# Nikdy nezobrazovat konfiguracni instalacni obrazovku
RewriteRule ^wp-admin/setup-config\.php$ – [F,L]
</IfModule>
# Pro 503 pouzijeme stejnou stranku jako pro DB error
ErrorDocument 503 /wp-content/db-error.php

Tím zajistíte, že:

/wp-admin/install.php

vrátí stav 503 a zobrazí vaši výpadkovou stránku.

a

/wp-admin/setup-config.php

bude zakázané.

Jak to otestovat?

Zkuste v prohlížeči otevřít:

https://vas-web.cz/wp-admin/install.php

Neměla by se zobrazit instalační obrazovka WordPressu, ale vaše výpadková stránka.

Ještě lépe to ověříte přes terminál:

curl -I https://vas-web.cz/wp-admin/install.php
curl -I https://vas-web.cz/wp-admin/setup-config.php

Správný výsledek je zhruba:

/wp-admin/install.php        503
/wp-admin/setup-config.php   403

Pokud používáte Cloudflare, je zároveň vhodné ověřit, že se tyto odpovědi nekešují. U podobných adres chcete vidět spíš DYNAMIC, ne HIT.

Shrnutí

Na produkčním WordPressu se instalační obrazovka nemá nikdy veřejně zobrazovat. Pokud hosting na chvíli odstaví databázi, návštěvník má vidět normální výpadkovou stránku, ne install.php.

Minimum, které stojí za to udělat:

/wp-content/db-error.php

a v .htaccess zablokovat:

/wp-admin/install.php
/wp-admin/setup-config.php

Je to jednoduchá pojistka, která může při výpadku databáze ušetřit dost nepříjemností.

PS: Text výše je kompletní souhrn od ChatGPT se kterou jsem to intenzivně řešil, tohle nemá smysl psát ručně a já si sem velmi často schovávám řešení i pro sebe 🙂 A ilustrační obrázek je taky nový pokus od AI. S Codexem dávám dohraomdy „mj desk“, pomůcku co z promptů dělá ilustrace k článkům v konkrétních stylech. Ale je to docela boj a tady, u 365tipů, to bude složitější. Ale ladit to budu jen postupně, nemám tolik časi ani „času“ v Midrjourney abych tomu věnoval pár hodin a desítky pokusů