Résoudre l’erreur 500, erreur serveur interne (internal server error)

Dans cet article

Parfois, quand vous installez WP Rocket, vous obtenez un message d’erreur 500 Internal Server Error à la place de votre site. Et s'il y a bien une chose qu'on déteste, c'est ça !

Il y a plusieurs raisons possibles à ce problème, certaines peuvent être liées à WP Rocket, d'autres non...

Déboguer

Sauvegarder et Supprimer .htaccess

La première chose que vous devez faire, c’est vous connecter via votre client FTP et trouver le fichier .htaccess (celui-ci peut être trouvé dans la racine de votre serveur). Créez une sauvegarde de ce fichier et renommez la ou supprimez la du serveur.

Si votre site revient en ligne, alors vous savez que le problème vient du fichier htaccess. Si vous remettez le fichier htaccess, le problème sera de retour, mais nous allons maintenant le résoudre. 

Affiner avec un MU-Plugin

Remarque : Vous pouvez aussi vous référer aux instructions générales de cette doc : comment créer un Custom (MU) Plugin

1
Créer un répertoire mu-plugins dans /wp-content
2
En utilisant un éditeur de texte basique, créez un nouveau fichier et collez-y le code suivant.
<?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');
3
Sauvegardez sous  wp-rocket-fix-500.php
4
Envoyez ce fichier dans le répertoire  mu-plugins créé à l'étape 1.
5
Enfin, désactivez et réactivez bien WP Rocket.

Une fois le MU-plugin uploadé et la page rafraichie dans votre navigateur, l'erreur 500 devrait être partie, mais vous avez supprimé tout les blocs de règles de WP Rocket de votre .htaccess.

Alors que vous ne devriez supprimer que les blocs qui empêche l'erreur de revenir.

Faisons-le maintenant :

1
Retirez les lignes add_filter() du mu-plugin, une à une.
2
Après chaque retrait de ligne, sauvegardez le fichier, désactivez et réactivez WP Rocket, and check your site.
3
Quand l'erreur 500 est de retour, vous savez que la ligne que vous venez de supprimer était celle qui prevenait l'erreur.
4
Rajouter la dernière ligne retirée et supprimez toutes les autres ligne débutant par  add_filter.

Voilà, l'erreur 500 devrait être corrigée!

Note: Une autre méthode pour déboguer serait d'ouvrir votre fichier .htaccess et de supprimer chaque blocs de règles un par un jusqu'à ce que l'erreur disparaisse. Mais le mieux reste de créer un Mu-plugin.Cette vidéo montre comment debugger le fichier htaccess video expliquant comment déboguer le Htaccess [EN]

Réferences : règles .htaccess ajoutée par WP Rocket

Charset

rocket_htaccess_charset();
rocket_htaccess_etag();
rocket_htaccess_web_fonts_access();
rocket_htaccess_files_match();
rocket_htaccess_mod_expires();
rocket_htaccess_mod_deflate();
rocket_htaccess_mod_rewrite();

Ces filtres représentent les blocs suivants : 

Encodage des caractères

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

Polices web

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>