WordPressでindex.htmlへのアクセスされた場合の404を改善!.htaccessによるリダイレクト

元はHTMLで出来ていたサイトをWordPressにした場合、index.htmlなどのGoogleインデックスが残ってしまい、SearchConsoleで『見つかりませんでした 』とクロールエラーが出てしまいました・・・

やはり、「index.html」へのアクセスが、「404 – Page Not Found」はちょっと寂しいですし。

その為、htaccessでindex.htmlなしに統一しクロールエラーを改善する事にしました
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html?$ / [R=301,L]
RewriteRule ^default\.html?$ / [R=301,L]
RewriteCond %{REQUEST_FILENAME} !\.(html?|xml|xsl|js|css|jpe?g|png|gif|ico)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

これでスッキリ統一されてSEO的にも改善されそうです

ちなみにWordPress使っていない場合や404が出てない場合でも統一した方がSEO的によくなります

通常のサイトでindex.html(またはindex.htm)のあり、なしを統一する方法

「index.html」のあり、なしとはどういうことかというと、

http://www.club-s-group.com/index.html
http://www.club-s-group.com/

この2つのアドレスは、
wwwありの(http://www.club-s-group.com/)、wwwなしの(http://club-s-group.com/)の考えと同じように
index.htmlがあり、なしも
別のページ」だと検索ロボットは判断しています。

リンクが分散されますので統一が必要です。

ホームページを見るユーザー(お客様)視点では
アドレスは短く分かりやすいのがいいので
index.htmlなしで統一するのをお勧めします。

今回も.htaccessで301リダイレクトを使い統一する方法です。

「.htaccess」ファイルを使用します。
テキストエディタ(メモ帳など)に、以下の内容を記述し保存してください。

ファイル名は、「1.htaccess.txt」として保存。
(“1”の部分はお好きな文字でOKです。)

index.htmlなしに統一

RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://www.club-s-group.com/$1 [R=301,L]

これで分散されていた評価がまとまりますので、無駄なくSEOの強化が行えます

WordPressのページネーションのサーチコンソール重複対策について

ページネーションされても2ページ目以降のタイトルやらディスクリプションはそのままなのでサーチコンソールで重複をしてきされてしまいます

WordPressのhomeやカテゴリページって、記事が増えていくと勝手にページを分割してくれるじゃないですか。
たとえば以下の様な形になります

http://asc-cl.jp/blog/

http://asc-cl.jp/blog/page/2/

 

多くのテーマでは、特に何も設定しない限り、同一のタイトル・メタディスクリプションで2ページ目以降が生成されます。
まぁ大抵の場合、人間が見れば「あーこれって続きの一覧ページなんだなぁ」と理解できますが、Googleのロボットはどんなに進化しても所詮ロボットなので、しっかりと伝えてあげる必要があるのです。

やりたいこと

1.タイトルやらディスクリプションやらに「このページは2ページ目ですよ」と伝わる表記を入れたい。
2.Googleのロボットに「このページには前のページ(または次のページ)があるよ」と伝えたい。

以上の2点になります。
1.は普通にタイトルやディスクリプションなどに「2ページ目|おれだよ!!!」といったように「◯ページ目」の文字を加える作業です。

また、2.に関しては、rel=”next”とrel=”prev”というタグを使用し、Googleに分割されたページの構成を伝えるものになります。

具体的な手順

タイトルなどに「◯ページ目」を加える

当ブログでは、タイトルタグとメタディスクリプションに「◯ページ目|」の文字を加えています。

タイトルタグを例にとって説明します。
header.php等のtitleタグを管理しているテンプレートに下記の記述を埋め込んで下さい。

<?php if($paged !=0){echo $paged."ページ目|";} ?>

 

if($paged !=1)
の部分は1ページ目には表示させないという記述部分なので、
1ページ目にも表示させる場合は

1
<?php if($paged){echo $paged."ページ目";} ?>

でOK

とのことなのですが、0ページ目も出てしまいますので、0ページ目に表示させないように

$paged !=1

$paged !=0

に変更して実装しています。

普通に存在している1ページ目が0ページ目としてカウントされている原因は意味不明なのですが、表示がおかしい場合は自己責任でいじってみてください。

rel=nextとrel=prevの実装

下記のような要件で実装したいと思いました。

  • homeページ、categoryページ、searchページなどの複数ページに分割されるページに実装
  • 記事ページ等で前の投稿、次の投稿には付けたくない(別に分割されているわけではないので)

どうやら、WordPressが自動でrel=nextやrel=prevを加えてくれるケースもあるようなのですが(テーマによって出力されるかどうかは違う)、その際、条件2つ目のように記事ページにも勝手に出力されてしまうそうです。

これは明らかにGoogleの意図した使用方法とは異なるはずなので、functions.phpに以下の記述を加え、wp_headでrel=nextやrel=prevを自動的に出力させないようにします。

1
2
3
4
5
6
<?php
remove_action('wp_head','index_rel_link');
remove_action('wp_head','parent_post_rel_link');
remove_action('wp_head','start_post_rel_link');
remove_action('wp_head','adjacent_posts_rel_link_wp_head');
?>

 

そして、肝心な分割されるページにrel=prev、rel=nextを加えるためには、おなじみifを使った条件分岐タグで実装します。
header.php内に下記の記述を追加して下さい。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php if(!is_single()|| !is_page()) { ?>
<?php
global $paged, $wp_query;
if ( !$max_page )
$max_page = $wp_query->max_num_pages;
if ( !$paged )
$paged = 1;
$nextpage = intval($paged) + 1;
if ( null === $label )
$label = __( 'Next Page &raquo;' );
if ( !is_singular() && ( $nextpage <= $max_page ) )
{
?>
<link rel="next" href="<?php echo next_posts( $max_page, false ); ?>" />
<?php     
}
global $paged;
if ( null === $label )
$label = __( '&laquo; Previous Page' );
if ( !is_singular() && $paged > 1  )
{
?>
<link rel="prev" href="<?php echo previous_posts( false ); ?>" />
<?php     
}
?>
<?php } ?>

1行目の

<?php if(!is_single()|| !is_page()) { ?>

は、記事ページと固定ページ以外の全てのページに加えるための記述です。
ifの中身で「複数ページにまたがっているかどうか」という条件があるので、必要ないっちゃ必要ない記述なのですが、念の為加えています。