Broken Link Checker はWordPressでリンク切れチェックをしてくれるプラグインで、あちこちで活用させていただいているのですが、コメント欄に入れてもらったURLにリンク切れのエラーが時々出てきて、その内容が ん?
だったので、調べました。
エラー:400 Bad Request の理由
コメント欄にコメントしてくれた訪問者が入力したURLにエラーがでてました。
そのURLはコメントをいれたページそのもののURL。
どうやら、コメントを入れてくれた方が、コメントを入れてくれたページのURLそのものをコピペで入れてくれたらしい。
そのWordPressサイトは日本語のスラッグを入れていたので、URIとしては結構長めになってまして、たとえばこんなかんじ。
で、日本語で表現すると、
hogeho.com/event/たのしいイベントをそのうちやるのでよろしくね/
みたいになるのですが、スラッグは全角なら22文字まで入るようになっていました。
それをめいっぱい使ったら、「たのしいイベントをそのうちやるのでよろしくね」となって、URIは223文字になってたということです。
で、ですね。この223文字のURIをコメント欄のURLにいれるとどうなるかというと、なんと勝手に200文字に縮められてしまうわけです。
最後の23文字を勝手に消してしまうのですから、そりゃリンク切れになりますよ。。
これはWordPressのバグか?
と初めは疑ったのですが、 しらべてみるうちに、WordPressのデータベースをみて答えがわかりました。
コメント欄の内容は、wp_commentsテーブルに格納されるのですが、
URLは、comment_author_urlカラムに格納され、その種別はvarchar(200)。
半角で200文字しか格納できないわけですね。
ほかのURLはというと、varchar(255)となっているので、255文字まで格納できるようになっています。
なのに、なんで wp_comments の comment_author_url が200文字までなのか、なぞです。
じゃ、このカラム comment_author_url をvarchar(255)に変えてしまったらいいんじゃね?と安直に思ったのですが、まぁまてよ。と調べてみたところ、そうもいかないようです。
というのも、wp_commentsはトラックバックにも使われてて、他のWordPressのサイトにURLを通知した時、200文字以上のURLだと受け取り側のWordPressで comment_author_url に格納できずにトラックバックのURLがリンク切れということになってしまいます。
つまり、送り側の comment_author_url を255文字に変更しても、受け取り側のWordPressで200文字に勝手に縮められてしまうので、トラックバックでの問題が残ってしまう。ということです。
相手側のデータベースをいじることはできませんからね。
なので、根本的な解決方法は、スラッグを入れるときに、全体のURLが200文字を超えないように気をつける。ということになります。
人力ですけど。 (追記:editable_slugというフックを使えば、自動で制限もできしそう)
対策:スラッグの文字数を制限する
http://hogeho.com/event/たのしいイベントをそのうちやるのでよろしくね/
というURIなら、http://hogeho.com/event/で24文字となります。
コメントのURLは200文字までなので、残り176文字。
日本語でパーマリンクを設定した場合、全角一文字に半角9文字を使うのと、URIの最後に/がつくので、 (176-1)÷9≒19文字 ということで、日本語でスラッグをいれるときは19文字まで。とすれば、リンク切れは起きない。
はず。
ということは、「たのしいイベントをそのうちやるのでよろしく」は22文字なので、あらため、
http://hogeho.com/event/たのしいイベントそのうちやるのよろしく/
とすればOK。
そもそも、日本語のスラッグつけなければいいんですけどね。
でも、適切な日本語URLは、クリック率は上がると思うので。
あと、コメントを許可したり、トラックバックを使わないようなサイトでは気にしなくてもOK。