Hyper Estraier で WordPress をクロール

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

強引ですが :mrgreen: