どうすればWordpressの404処理をスキップし、静的ファイルの404エラーすべてを404.htmlにリダイレクトすることができますか?
私が読んで、パーマリンクを使うときそれが不可能であるように思われますか?
目的はphpをロードしないことで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プラグインによって生成されました*
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;
}
たぶん簡単な解決策。条件タグis_404()
を使用して、静的ファイルへのリダイレクトを作成します。テーマのファイルheader.php
またはindex.php
にコードを含めます。
これが一例です。
if ( is_404() ) {
wp_redirect( 'static.htm' );
exit;
}
リンク集
Chris_Oが言ったことを拡張するために……W3 Total Cacheをインストールし、そのプラグインの設定を使って静的ファイルをキャッシュしないようにします。プラグイン自体は非常に便利で、特に最新のアップデートであなたのサイトをスピードアップするのに必須です。
静的ファイルの404、403(禁止)などの処理方法については、Wordpressの エラー404ページの作成 を参照することをお勧めします。
これが可能かどうかはわかりません。パーマリンクを有効にしたときにWordPressが作成するhtaccessコードを見ると、基本的に「ファイル/ディレクトリが見つからない場合はindex.phpに送信してください」と表示されます。これはすべての実際の404リクエストを含みます。 WordPressが知っている動的に生成されたすべてのパブリックリソースのリストを作成し、これを.htaccessに直接挿入する以外に、404を処理するためにphpをロードする必要があります。
私は私のサイトに複数の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/ のルートにあります。
P.S変更を有効にするには、php.iniファイルまたはnginx.confファイルを変更した後でPHPおよびNginxサービスを再起動する必要があることを忘れないでください。
Chris_O のアイデアが好きでしたが、私は自分のバージョンを作ったので、もっと安全です。
だから私がやったこと、私はちょうどあなたの要求がそれらの行から始まるのであれば例外にフォルダを追加しました - それは間違いなく有効なパーマリンクではありません。要求の大部分は、これらのフォルダの内容を悪用するためにチェックしようとしているボットからのものです。それらは効果的にフィルタリングされ、必要に応じてあなたはいくつかの小さな静的な404ページを表示することができます。
他のリクエストは依然としてワードプレスによって処理され、誰かが間違ったアドレスを入力した場合、それはあなたのテンプレート内にユーザーフレンドリーなnot foundメッセージを表示します。 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>