it-swarm.com.de

Servieren Sie Apache 404 für fehlende Assets und nicht wp 404 template WP_Rewrites

Ich habe eine benutzerdefinierte 404-Seite, möchte sie jedoch nicht für jedes defekte Asset bereitstellen, das möglicherweise auftaucht. Stattdessen möchte ich nur den Apache 404 bedienen, da dieser viel schneller ist. Ich habe die folgende htaccess-Regel gefunden, die das erreicht, wonach ich strebe:

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

Aber anstatt es manuell vor # BEGIN WordPress in die htaccess-Datei zu stellen, möchte ich die Regel programmatisch über das Theme hinzufügen, da ich auch versuche, mich mit der Rewrite-API von WP vertraut zu machen. Meine aktuellen Regeln sind unten aufgeführt, wobei die entscheidende Zeile zum Testen manuell hinzugefügt wurde:

# 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>

Ich habe eine Menge Beispiele in und Anstrengungen gesucht, um dies zu erreichen , aber sie scheinen außerordentlich kompliziert und nicht direkt anwendbar zu sein. Könnte jemand versuchen, mich in die richtige Richtung zu lenken? Dies ist, was ich (nicht den Trick machend) bis jetzt habe:

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');

Danke fürs schauen

3
orionrush

Diese sehr hilfreiche Seite ist leider irgendwie im Codex vergraben:

Grundsätzlich macht mod_rewrite_rules hook den Trick.

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');

Hiermit werden die gewünschten Regeln innerhalb des # Begin WordPress-Blocks, jedoch außerhalb des <IfModule mod_rewrite.c>-Blocks vorangestellt/angehängt. Ich habe add_rewrite_rule() function untersucht, aber Sie können die RewriteRule-Flags nicht ändern.

2
orionrush