Pokud chcete vytvořit webový server nebo backendovou službu v PHP, nejspíše šáhnete po některém z frameworků jako jsou Laravel nebo Slim. Můžete ale narazit, pokud se takový framework pokusíte rozběhnout na hostingové službě, například té, kterou nabízí Wedos.
Je dobrý nápad postavit aplikaci na některém z existujících frameworků, jako jsou Laravel nebo Slim. Znamená to totiž, že bude postaráno o základní funkce jako je routování (způsob, jakým určíme, který skript v PHP má zpracovat který request). V mnoha případech také můžeme implementovat další funkce, například přihlašování uživatelů, pomocí přídavných balíčků. Téměř okamžitě tak můžeme začít psát kód, který je specifický pro naši aplikaci.
Na lokálním serveru běží aplikace skvěle, a tak ji chceme ukázat světu. Když ale nahrajeme kód na hosting, může se stát, že aplikace nebude vůbec fungovat a přivítá nás chybou 500 Internal Server Error. To platí například i v případě nejúspěšnější české hostingové služby Wedos.
Chyba 500, která se zobrazí na Wedosu při špatném nastavení souboru htaccess.
Jejich chybová hláška nás upozorní, že příčinou chyby může být nastavení v .htaccess
souboru, a nasměruje nás na znalostní bázi. V té jsou konkrétněji popsány časti funkcí pro soubor .htaccess
, které Wedosem nejsou podporovány, a jejich použití tak může být příčinou chyby 500.
Když jsem se sám snažil hostovat stránku postavenou na frameworku Slim na Wedosu, konkrétní řešení jsem ve znalostní bázi ale nenašel, a při vyhledávání na Google jsem narazil pouze na dotaz jednoho uživatele, který ale nebyl vyřešen. Po troše experimentování s obsahem soubor(ů) .htaccess
jsem ale objevil následující řešení:
Nejprve v kořenovém adresáři frameworku upravíme .htaccess
soubor odstraněním nebo zakomentováním prvního řádku.
#Options All -Indexes
<Files .htaccess>
order allow,deny
deny from all
</Files>
<IfModule mod_rewrite.c>
# Redirect to the public folder
RewriteEngine On
# RewriteBase /
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
# Redirect to HTTPS
# RewriteEngine On
# RewriteCond %{HTTPS} off
# RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
Pokud jste následovali instrukce ve znalostní bázi, možná už tento krok máte za sebou a divíte se, proč chyba 500 nezmizela. Je totiž potřeba upravit také .htaccess
soubor ve složce public
, a to na dvou místech: Stejně jako v předchozím souboru odstraníme nebo zakomentujeme řádek s Options
, dále ale musíme odstranit i řádky 24 a 25 (RewriteRule s použitím E=BASE
).
#Options All -Indexes
<Files .htaccess>
order allow,deny
deny from all
</Files>
<IfModule mod_rewrite.c>
RewriteEngine On
# Redirect to HTTPS
# RewriteEngine On
# RewriteCond %{HTTPS} off
# RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Some hosts may require you to use the `RewriteBase` directive.
# Determine the RewriteBase automatically and set it as environment variable.
# If you are using Apache aliases to do mass virtual hosting or installed the
# project in a subdirectory, the base path will be prepended to allow proper
# resolution of the index.php file and to redirect to the correct URI. It will
# work in environments without path prefix as well, providing a safe, one-size
# fits all solution. But as you do not need it in this case, you can comment
# the following 2 lines to eliminate the overhead.
# RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\\2$
# RewriteRule ^(.*) - [E=BASE:%1]
# If the above doesn't work you might need to set the `RewriteBase` directive manually, it should be the
# absolute physical path to the directory that contains this htaccess file.
# RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
</IfModule>
Po těchto změnách by vaše aplikace měla být funkční i na hostingu. Testoval jsem Slim ve verzi 4.10. a tento experiment jsem provedl v říjnu 2024. Obsah aplikace byl vesměs nezměněný od ukázkového projektu v tomto frameworku. Navrch jsem přidal jednoduchý formulář s odesláním pomocí POST metody a přesměrováním na jinou stránku. Aplikace běžela na subdoméně.
Pokud ve vašem případě problémy s chybou 500 stále přetrvávají, popište je prosím v komentářích.