Risolvere l'errore 500 - Internal Server Error

In questo articolo

Se c'è una cosa che vorremmo proprio evitare, è che, dopo aver installato WP Rocket, il tuo sito web si scontrasse con un enigmatico “500 Internal Server Error”, uscendo di scena in modo glorioso. Detestiamo che succeda, eppure a volte, in seguito a circostanze che non possiamo controllare, succede. Qui ti spieghiamo cosa puoi fare per risolvere il problema.

Debugging

Backup e rimozione del .htaccess

La prima cosa che devi fare è connetterti al tuo FTP e cercare il file  .htaccess (lo trovi nella root del tuo server). Fai un backup del file e poi rinominalo o cancellalo dal server.

Se il tuo sito torna online, significa che il problema risiede nel file .htaccess file. Ora, ricolloca il file originale nella root del server: il problema si ripresenterà, ma stavolta lo risolveremo :)

Aggiustamento con un plugin di supporto

WP Rocket usa 7 filtri PHP filters per aggiungere 7 blocchi di regole al tuo file .htaccess (controlla le referenze alla fine dell'articolo).

Per poter fare il debug di questi blocchi, uno per uno, installa questo piccolo plugin di supporto:

📥  Scarica (.zip):  WP Rocket | Remove All .htaccess Rules
Se ti occupi dello sviluppo del sito web, il codice per questo plugin si trova in GitHub.

Non appena attivi il plugin e aggiornando la pagina nel navigatore, l'error 500 dovrebbe essere scomparso, però ora tutti i blocchi di regole di WP Rocket sono scomparsi dal tuo file .htaccess 

Tuttavia, dovresti eliminare solamente i blocchi necessari per eliminare l'errore. Per cui facciamo quanto segue: 

1
Elimina le linee  add_filter() del plugin, una alla volta.
2
Ogni volta che elimini una linea, salva il file, disattiva e riattiva WP Rocket y controlla il tuo sito web.
3
Quando l'errore 500 tornerà a presentarsi, saprai che la linea che hai appena eliminato era quella che permetteva di evitare l'errore. 
4
Aggiungi di nuovo l'ultima linea eliminata ed elimina tutte le altre che iniziano con  add_filter.

Voilà, l'error 500 dovrebbe essere risolto ora!

Nota: un metodo alternativo per risolvere il problema, sarebbe aprire il file .htaccess ed eliminare ogni blocco di regole une per uno, fino alla sparizione dell'errore. In questo modo  sapresti anche qual è esattamente il blocco che sta causando l'errore, pero dovresti comunque usare il plugin di cui sopra per risolvere il problema in modo definitivo.
Qui trovi un   video che spiega questo procedimento alternativo.

Riferimento: regole del .htaccess

Charset

rocket_htaccess_charset();
# Use UTF-8 encoding for anything served text/plain or text/html
AddDefaultCharset UTF-8
# Force UTF-8 for a number of file formats
<IfModule mod_mime.c>
AddCharset UTF-8 .atom .css .js .json .rss .vtt .xml
</IfModule>

ETag

rocket_htaccess_etag();
# FileETag None is not enough for every server.
<IfModule mod_headers.c>
Header unset ETag
</IfModule>


# Since we're sending far-future expires, we don't need ETags for static content.
# developer.yahoo.com/performance/rules.html#etags
FileETag None

WebFonts

rocket_htaccess_web_fonts_access();
# Send CORS headers if browsers request them; enabled by default for images.
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
# mod_headers, y u no match by Content-Type?!
<FilesMatch "\.(cur|gif|png|jpe?g|svgz?|ico|webp)$">
SetEnvIf Origin ":" IS_CORS
Header set Access-Control-Allow-Origin "*" env=IS_CORS
</FilesMatch>
</IfModule>
</IfModule>


# Allow access to web fonts from all domains.
<FilesMatch "\.(eot|otf|tt[cf]|woff2?)$">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
</FilesMatch>

FilesMatch

rocket_htaccess_files_match();
<IfModule mod_alias.c>
<FilesMatch "\.(html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml)$">
<IfModule mod_headers.c>
Header set X-Powered-By "WP Rocket/2.6.8"
Header unset Pragma
Header append Cache-Control "public"
Header unset Last-Modified
</IfModule>
</FilesMatch>


<FilesMatch "\.(css|htc|js|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|json|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|otf|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|tif|tiff|ttf|ttc|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$">
<IfModule mod_headers.c>
Header unset Pragma
Header append Cache-Control "public"
</IfModule>
</FilesMatch>
</IfModule>

ModExpires

rocket_htaccess_mod_expires();
# Expires headers (for better cache control)
<IfModule mod_expires.c>
ExpiresActive on


# Perhaps better to whitelist expires rules? Perhaps.
ExpiresDefault                          "access plus 1 month"


# cache.appcache needs re-requests in FF 3.6 (thanks Remy ~Introducing HTML5)
ExpiresByType text/cache-manifest       "access plus 0 seconds"


# Your document html
ExpiresByType text/html                 "access plus 0 seconds"


# Data
ExpiresByType text/xml                  "access plus 0 seconds"
ExpiresByType application/xml           "access plus 0 seconds"
ExpiresByType application/json          "access plus 0 seconds"


# Feed
ExpiresByType application/rss+xml       "access plus 1 hour"
ExpiresByType application/atom+xml      "access plus 1 hour"


# Favicon (cannot be renamed)
ExpiresByType image/x-icon              "access plus 1 week"


# Media: images, video, audio
ExpiresByType image/gif                 "access plus 1 month"
ExpiresByType image/png                 "access plus 1 month"
ExpiresByType image/jpeg                "access plus 1 month"
ExpiresByType video/ogg                 "access plus 1 month"
ExpiresByType audio/ogg                 "access plus 1 month"
ExpiresByType video/mp4                 "access plus 1 month"
ExpiresByType video/webm                "access plus 1 month"


# HTC files  (css3pie)
ExpiresByType text/x-component          "access plus 1 month"


# Webfonts
ExpiresByType application/x-font-ttf    "access plus 1 month"
ExpiresByType font/opentype             "access plus 1 month"
ExpiresByType application/x-font-woff   "access plus 1 month"
ExpiresByType application/x-font-woff2  "access plus 1 month"
ExpiresByType image/svg+xml             "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"


# CSS and JavaScript
ExpiresByType text/css                  "access plus 1 year"
ExpiresByType application/javascript    "access plus 1 year"


</IfModule>

ModDeflate

rocket_htaccess_mod_deflate();
# Gzip compression
<IfModule mod_deflate.c>
# Active compression
SetOutputFilter DEFLATE
# Force deflate for mangled headers
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
# Don't compress images and other uncompressible content
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png|rar|zip|exe|flv|mov|wma|mp3|avi|swf|mp?g)$ no-gzip dont-vary
</IfModule>
</IfModule>


# Compress all output labeled with one of the following MIME-types
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE application/atom+xml \
		                          application/javascript \
		                          application/json \
		                          application/rss+xml \
		                          application/vnd.ms-fontobject \
		                          application/x-font-ttf \
		                          application/xhtml+xml \
		                          application/xml \
		                          font/opentype \
		                          image/svg+xml \
		                          image/x-icon \
		                          text/css \
		                          text/html \
		                          text/plain \
		                          text/x-component \
		                          text/xml
</IfModule>
<IfModule mod_headers.c>
Header append Vary: Accept-Encoding
</IfModule>
</IfModule>

ModRewrite

rocket_htaccess_mod_rewrite();
<IfModule mod_mime.c>
AddType text/html .html_gzip
AddEncoding gzip .html_gzip
</IfModule>
<IfModule mod_setenvif.c>
SetEnvIfNoCase Request_URI \.html_gzip$ no-gzip
</IfModule>


<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} on [OR]
RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} https
RewriteRule .* - [E=WPR_SSL:-https]
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteRule .* - [E=WPR_ENC:_gzip]
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} =""
RewriteCond %{HTTP:Cookie} !(wordpress_logged_in_|wp-postpass_|wptouch_switch_toggle|comment_author_|comment_author_email_) [NC]
RewriteCond %{REQUEST_URI} !^(/_test/|/wp-json/(.*))$ [NC]
RewriteCond %{HTTP_USER_AGENT} !^(facebookexternalhit).* [NC]
RewriteCond "%{DOCUMENT_ROOT}/wp-content/cache/wp-rocket/%{HTTP_HOST}%{REQUEST_URI}/index%{ENV:WPR_SSL}.html%{ENV:WPR_ENC}" -f
RewriteRule .* "/wp-content/cache/wp-rocket/%{HTTP_HOST}%{REQUEST_URI}/index%{ENV:WPR_SSL}.html%{ENV:WPR_ENC}" [L]
</IfModule>

Per capire quale di questi blocchi sta causando il problema, devi fare dei test rimuovendoli uno a uno dal file.

Quindi apri il file htaccess e cancella i blocchi di WP Rocket uno per volta. Salva il file dopo ogni rimozione e controlla il tuo sito web volta per volta per vedere se l'eliminazione del blocco cambia qualcosa. Quando vedrai l'errore sparire, saprai di aver rimosso il blocco problematico. 

Per rimuovere permanentemente il blocco che crea il problema, dovresti  creare un nuovo MU plugin: infatti ,se hai appena rimosso manualmente il blocco dal file htaccess, questo verrà reinserito una volta che salverai di nuovo le impostazioni di WP Rocket.

Questo video ti mostra come fare il debug del file htaccess

Per creare il MU plugin: 

1) Crea la directory mu-plugins dentro wp-content 

2) Usando un editor di testo basico, crea un nuovo file e incolla il codice sotto. Devi aggiungere solo una delle linee che inizia con add_filter, ovvero quella che corrisponde al blocco di regole che genera il problema:

<?php  
defined( 'ABSPATH' ) or die( 'Cheatin\' uh?' ); 
/* 
 Plugin Name: Fix 500 Error
 Author: Jonathan (WP Rocket Team) 
 Author URI: http://wp-rocket.me 
*/
add_filter('rocket_htaccess_charset', '__return_false');
add_filter('rocket_htaccess_etag', '__return_false');
add_filter('rocket_htaccess_web_fonts_access', '__return_false');
add_filter('rocket_htaccess_files_match', '__return_false');
add_filter('rocket_htaccess_mod_expires', '__return_false');
add_filter('rocket_htaccess_mod_deflate', '__return_false');
add_filter('rocket_htaccess_mod_rewrite', '__return_false');

Non dimenticare di riattivare WP Rocket dopo aver fatto questa modifica. 

Un modo alternativo per fare il debug è creare un MU plugin che riporti tutto il codice sopra, e rimuovere ogni filtro uno alla volta fino a che il problema non ricompare, così saprai quale sta causando il problema.

Aumentare il limite di memoria

Se, nonostante il plugin che ti abbiamo presentato e la rimozione delle regole dall'htaccess, l'errore 500 non si risolve, dovresti  Aumentare il limite di memoria nel tuo server.