ワードプレスの404処理をスキップして、静的ファイルのすべての404エラーを404.htmlにリダイレクトするにはどうすればよいですか?


17

ワードプレスの404処理をスキップして、静的ファイルのすべての404エラーを404.htmlにリダイレクトするにはどうすればよいですか?

私は読んで、パーマリンクを使用するとき、それは不可能のようです

目的は、phpをロードしないことにより、404エラーのサーバー負荷を減らすことです。

回答:


8

.htaccessは、静的ファイルの WordPress 404エラー処理をスキップします

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_URI} !(robots\.txt|sitemap\.xml(\.gz)?)
        RewriteCond %{REQUEST_FILENAME} \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$ [NC]
        RewriteRule .* - [L]
    </IfModule>

注:これらのルールは、W3 Total Cacheプラグインによって生成されました*

Nginxは静的ファイルのWordPress 404処理をスキップします。

if (-f $request_filename) {
    break;
}
if (-d $request_filename) {
    break;
}
if ($request_uri ~ "(robots\.txt|sitemap\.xml(\.gz)?)") {
    break;
}
if ($request_uri ~* \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$) {
    return 404;
}

1

Chris_Oの発言を拡張するには、... W3 Total Cacheをインストールし、そのプラグインの設定を使用して静的ファイルをキャッシュしません。プラグイン自体は非常に便利であり、特に最新の更新では、サイトを高速化する必要があります。

また、Wordpressからのエラー404ページの作成を参照して、静的ファイル、403(禁止)などの404の処理方法を確認することをお勧めします。


1

たぶん簡単な解決策。条件タグis_404()を使用して、静的ファイルへのリダイレクトを作成します。ファイルheader.phpまたはindex.phpテーマのコードを含めます。

ここに例があります。

   if ( is_404() ) {
      wp_redirect( 'static.htm' );
      exit;
   }

リンク集


2
意思決定は、htaccessレベルではなく、PHPで行われます。404エラーのためにPHPのロードを完全にスキップすることが目的です。
-freethinker

2
@freethinker:正しい、php経由のみ。htaccess経由の方法は高速ですが、WordPressでの処理はそれほど簡単ではないかもしれません
-bueltge

@kaiserおっと、質問更新
freethinker

0

これが可能かどうかはわかりません。パーマリンクを有効にしたときにWordPressが作成するhtaccessコードを見ると、基本的に「ファイル/ディレクトリが見つからない場合は、index.phpに送信してください」と表示されます。これには、実際の404リクエストがすべて含まれます。WordPressが知っている動的に生成されたすべてのパブリックリソースのリストを作成し、これを.htaccessに直接挿入する以外に、PHPをロードして404を処理する必要があります。


0

私はChris_Oのアイデアが好きでしたが、より安全な独自のバージョンを作成しました。

だから、私がやったことは、例外にフォルダを追加しただけなので、あなたのリクエストがそれらの行から始まる場合、それは間違いなく有効なパーマリンクではありません。要求の大部分は、これらのフォルダーのコンテンツを悪用してチェックしようとしているボットからのものです。それらは効果的にフィルタリングされ、必要に応じて小さな静的な404ページを表示できます。

他のリクエストは引き続きワードプレスで処理されます。誰かが間違ったアドレスを入力すると、テンプレート内にユーザーフレンドリーではないというメッセージが表示されます。Chris_Oのソリューションは、ファイル拡張子のように見えるリクエストに対してのみ機能します。それ以外の場合は、ワードプレスによっても処理されます。

さらに信頼性を高めるために、未加工のアクセスファイルを取得して404エラーを検索できます。特定の行で始まる多くのリクエストに気付いた場合は、それらをこのフィルターに含めることもできます。

#adding your own handler
ErrorDocument 404 /404/index.html

<IfModule mod_rewrite.c>
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_URI} !^/(404|cgi-bin|wp-admin|wp-content|wp-includes)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

0

サイトに複数のCMSがインストールされているため、このようなものを使用して、すべてのCMSに同じ404エラーページを使用します。私はNginx + FastCgiにこのconfを使用し、うまく機能しています:

server {
    ...
    error_page 404 /404.html; #enable custom 404 error page
    location ~ /\.ht {
        deny all; #disable access to htaccess
    }
    location ~ [^/]\.php(/|$) {
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_intercept_errors on; #disable PHP 404 error intercept
    }
    location /wordpress/ {
        try_files $uri $uri/ /wordpress/index.php?$args;
    }
}

この設定をphp.iniで使用します:

cgi.fix_pathinfo = 1 

wordpressはhttp://example.com/wordpress/のようにインストールされます。404.htmlはhttp://example.com/のルートにあります。

PS変更を有効にするには、php.iniまたはnginx.confファイルに変更を加えた後、PHPおよびNginxサービスを再起動する必要があることを忘れないでください。


-3

これを行うには3つの方法があります

  1. 404.phpコードを変更します。
  2. ワードプレスプラグインを使用する。
  3. .htaccessファイルを編集します。

完全なチュートリアル-(リンク切れ、スパムにリダイレクト)


こんにちはMazhar、あなたのサイトへの単なるリンクではなく、完全な回答を投稿してもらえますか。そのリンクが死んでも、この答えはほとんど役に立たないでしょう!乾杯!
スティーブンハリス

このページは404を提供します。皮肉。それとも、何かを言おうとしていますか?
ミシエルファンデルブロンク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.