Hyper Estraier で WordPress をクロールしようとしたところ
redirected: 301 されてしまいインデックスされない 🙁
$ estwaver crawl -revcont casket
2014-05-15T03:40:17Z INFO DB-EVENT: status: name=casket/_index dnum=0 wnum=0 fsiz=9259055 crnum=0 csiz=0 dknum=0
2014-05-15T03:40:17Z INFO crawling started (revcont)
2014-05-15T03:40:17Z INFO fetching: 0: https://www.yonageya.com/
2014-05-15T03:40:17Z INFO seeding: 1.000: https://www.yonageya.com/
2014-05-15T03:40:17Z INFO [1]: fetching: 0: https://www.yonageya.com/
2014-05-15T03:40:18Z INFO [2]: fetching: 1: https://www.yonageya.com/blog/
2014-05-15T03:40:18Z INFO [2]: redirected: 301: https://www.yonageya.com/blog/
2014-05-15T03:40:18Z INFO waiting for threads: 0
2014-05-15T03:40:18Z INFO crawling finished
2014-05-15T03:40:18Z INFO DB-EVENT: flushing index words: name=casket/_index dnum=1 wnum=1 fsiz=9262217 crnum=670 csiz=45533 dknum=0
2014-05-15T03:40:18Z INFO DB-EVENT: flushing auxiliary keywords: name=casket/_index dnum=1 wnum=639 fsiz=9262217 crnum=31 csiz=2182 dknum=0
2014-05-15T03:40:18Z INFO DB-EVENT: closing: name=casket/_index dnum=1 wnum=639 fsiz=9274906 crnum=0 csiz=0 dknum=0
2014-05-15T03:40:18Z INFO finished successfully
301 部分だけ抜き出すと
[2]: redirected: 301: https://www.yonageya.com/blog/
ネットで調べたところ同じ状況の方がいらっしゃいました。
ヒントにさせていただき、調べてみたところ wp-includes/canonical.php に辿り着きました。
/**
* Filter the canonical redirect URL.
*
* Returning false to this filter will cancel the redirect.
*
* @since 2.3.0
*
* @param string $redirect_url The redirect URL.
* @param string $requested_url The requested URL.
*/
$redirect_url = apply_filters( 'redirect_canonical', $redirect_url, $requested_url );
if ( !$redirect_url || $redirect_url == $requested_url ) // yes, again -- in case the filter aborted the request
return false;
if ( $do_redirect ) {
// protect against chained redirects
if ( !redirect_canonical($redirect_url, false) ) {
wp_redirect($redirect_url, 301);
exit();
} else {
// Debug
// die("1: $redirect_url<br />2: " . redirect_canonical( $redirect_url, false ) );
return false;
}
} else {
return $redirect_url;
}
$redirect_url と $requested_url を比較して同じだったらリダイレクトしないようですが、
実際に $redirect_url と $requested_url を調べてみたところ、
$redirect_url: https://www.yonageya.com/blog/
$requested_url: https://www.yonageya.com:80/blog/
とウチのブログの場合、$requested_url にポート番号がくっついていました ❗
ポート番号をくっつけているのは、同じ wp-includes/canonical.php の以下です。
if ( !$requested_url ) {
// build the URL in the address bar
$requested_url = is_ssl() ? 'https://' : 'http://';
$requested_url .= $_SERVER['HTTP_HOST'];
$requested_url .= $_SERVER['REQUEST_URI'];
}
ウチのブログの場合 $_SERVER[‘HTTP_HOST’] にポート番号がくっついていました。
そして、同じ状況の方と同じように $requested_url .= ‘www.yonageya.com’ とすると解決する事も確認しました。
それで、どうやって解決するか対応方法に悩みましたが、functions.php に以下を追加して対応しました。
function my_redirect_canonical($redirect_url, $requested_url) {
if (preg_match('/^HyperEstraier/', $_SERVER['HTTP_USER_AGENT'])) {
return false;
}
}
add_filter('redirect_canonical', 'my_redirect_canonical');
強引ですが