web-dev-qa-db-ja.com

Wp 404 template WP_Rewritesではなく、不足しているアセットについてApache 404を処理します。

私はカスタムの404ページを持っていますが、壊れる可能性があるすべてのアセットにそれを提供したくはありません。代わりに、Apache 404をはるかに高速に処理したいだけです。私はImが後に達成するであろう以下のhtaccess規則を見つけました:

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

しかし、その代わりに手動でそれを# BEGIN WordPressの前にhtaccessファイルに配置します。私は、WPの書き換えAPIを頭に入れようとしているので、テーマを介してプログラムでルールを追加したいと思います。私の現在のルールはテストのために手動で追加された決定的な行と共に以下です:

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

たくさんの の例の努力​​ を試してみました これを 達成するために、しかしそれらは非常に複雑に見え、直接適用できません。誰かが私を正しい方向に向けることに刺してもらえますか?これは私がこれまでに持っていることです(トリックをしていない):

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

見てくれてありがとう

3
orionrush

この非常に役立つページは残念ながら コーデックス で埋められているようなものです。

基本的にmod_rewrite_rulesフックがトリックを行います。

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

これは、# Begin WordPressブロック内で、<IfModule mod_rewrite.c>の外側で、目的の規則を先頭に追加します。私はadd_rewrite_rule()関数を検討していましたが、RewriteRuleフラグを変更することはできません。

2
orionrush