web-dev-qa-db-fra.com

Servir Apache 404 pour les actifs manquants plutôt que le modèle wp 404 WP_Rewrites

J'ai une page 404 personnalisée, mais je ne veux pas la servir pour chaque élément cassé susceptible de surgir. Au lieu de cela, je veux simplement servir l'Apache 404, car c'est beaucoup plus rapide. J'ai trouvé la règle htaccess suivante qui permettra d'obtenir ce que je veux après:

 RewriteEngine On
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule \.(jpg|jpeg|png|gif|ico|swf|bmp|js|css)$ - [nocase,redirect=404,last] 

Mais plutôt que de le placer manuellement dans le fichier htaccess avant le # BEGIN WordPress, j'aimerais ajouter par programme la règle via le thème, car je tente également de comprendre l'esprit de réécriture de l'API de WP. Mes règles actuelles sont ci-dessous avec la ligne cruciale ajoutée manuellement pour les tests:

# BEGIN WordPress
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteRule ^assets/css/(.*) /wp-content/themes/tr_roots_0.4.1/assets/css/$1 [QSA,L]
    RewriteRule ^assets/js/(.*) /wp-content/themes/tr_roots_0.4.1/assets/js/$1 [QSA,L]
    RewriteRule ^assets/img/(.*) /wp-content/themes/tr_roots_0.4.1/assets/img/$1 [QSA,L]
    RewriteRule ^plugins/(.*) /wp-content/plugins/$1 [QSA,L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule \.(jpg|jpeg|png|gif|ico|swf|bmp|js|css)$ - [nocase,redirect=404,last] 
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

J'ai cherché beaucoup de exemples dans et efforts pour essayer de atteindre ceci, mais ils semblent excessivement compliqués et ne sont pas directement applicables. Quelqu'un pourrait-il essayer de me mettre dans la bonne direction? C'est ce que j'ai (ne fais pas le tour) jusqu'ici:

function tr_flush_rewrites() {
  global $wp_rewrite;
  $wp_rewrite->flush_rules();
}

function tr_add_rewrites() {
     global $wp_rewrite;
      $tr_new_non_wp_rules = array(
       '\.(jpg|jpeg|png|gif|ico|swf|bmp)$' => 'nocase,redirect=404,last',
     );
     $wp_rewrite->non_wp_rules = $tr_new_non_wp_rules + $wp_rewrite->non_wp_rules;
}
add_action('generate_rewrite_rules', 'tr_add_rewrites');
add_action('admin_init', 'tr_flush_rewrites');

Merci d'avoir regardé

3
orionrush

Cette page très utile est malheureusement un peu enterrée sous le codex :

En gros, mod_rewrite_rules hook fera l'affaire.

function faster_htaccess_rules( $rules ){
$faster_rules = <<<EOD
\n # BEGIN faster Apache 404 rules
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.(jpg|jpeg|png|gif|ico|swf|bmp)$ - [R=404,L]
#Use instead for network sites
#RewriteRule \.(jpg|jpeg|png|gif|ico|swf|bmp)$ - [nocase,redirect=404,last]
# END faster Apache 404 rules\n\n
EOD;
return $faster_rules . $rules;
}
add_filter('mod_rewrite_rules', 'faster_htaccess_rules');

Cela ajoute/rajoute les règles désirées dans le bloc # Begin WordPress, mais en dehors de <IfModule mod_rewrite.c>. J'avais exploré la fonction add_rewrite_rule(), mais cela ne vous permettra pas de modifier les drapeaux RewriteRule.

2
orionrush