記事本文
「http://www.example.com/mt/mt-tb.cgi/***」へのトラックバックは失敗しました: HTTP error: 403 Throttled
発端は Re: i d e a * i d e a - ブログにコードを貼り付ける方法で悩むの巻から i d e a * i d e a - ブログにコードを貼り付ける方法で悩むの巻へトラックバックを送った時にエラーになった件から。
以前にも #movabletype-ja に参加しましたから #movabletype-ja (Kickstart my heart) にトラックバックを送ったら同じエラーになったことがあったので、この機会に調べてみることにしました。
Throttling 機能とは
そもそも Throttled ってなーに、っていう方もいると思うので簡単に解説。 Throttling 機能とは Movable Type 3.1 から実装された機能で、コメントやトラックバックなどが大量かつ連続して送られてきた場合に、システムが過負荷状態に陥らないようにコメントやトラックバックの受付を行わなくする機能です。 よって、 Throttled というのはコメントやトラックバックの受付制限を超えてしまい、受け付けられなかったということです。
その機能の設定は mt-config.cgi 内で ThrottleSeconds ディレクティブを設定することで行えます。 このディレクティブの初期値は 20 となっており、また Movable Type 3.3 以降の mt-config.cgi ではそのディレクティブはコメントとしても記述されておらず、管理者が自ら記述しない限りは変更されないため、多くの Movable Type による weblog では 20 になっていると思われます。 なお、この値はコメントやトラックバックの受付の他に、検索機能の実行間隔にも影響します。
これはコメント投稿の場合は、「同一 IP からの 20 秒以内の連続コメント投稿はスロットリングを行う」ということになり、「コメント・エラー」の画面を表示します。
よって、この値を大きくすればするほど連続投稿に対する制限としては厳しくなるということです。
ちなみに、エラーメッセージとしては
不必要なコメントの投稿を防ぐために、連続した投稿を受け付けないように設定しています。
しばらくしてから、もう一度試してみてください。
といったものが出力されるようです。
なお、 ThrottleSeconds ディレクティブの値を変更すると、 OneDayMaxPings ディレクティブにも影響を与えるのですが、それは後述します。
また、トラックバックに関しては IP アドレスのチェックを行わないようになっていますので、他の人とのトラックバック送信とほぼ同タイミングになった場合、連続投稿していないつもりでもスロットリングされてしまうということも起こり得ます。
なお、いくつかの記事を見て廻りましたが、トラックバックに関して同一 IP のチェックを行わないという動作をバグとしているところがかなりありました。
( 私も以前のそういった記事を読んでいて、てっきりバグなんだとばかり思っていましたが……。)
ThrottleSeconds ディレクティブの説明を見る限りでは、バグではなくそもそもそういう仕様としているようですね。
ちなみに、
トラックバックでは、一定時間内にトラックバックを受け付けない設定として使われます
というのは、 ThrottleSeconds によって直接的にスロットリングするのではなく、 ThrottleSeconds の値によって OneDayMaxPings の基準時間を設定するという間接的な働きをするということで、誤解を招きやすい表現になっていると思います。
コメントに対する Throttling の流れ
さて、それではコメントが連続して寄せられた場合の流れを考えてみましょう。
- コメントの初弾が投稿される
- 同じ IP アドレスからの第 2 弾コメントが
- ThrottleSeconds ディレクティブの値よりも短い間隔で投稿される
- スロットリングされ、データベースに記録されない
- ThrottleSeconds ディレクティブの値よりも長い間隔で投稿される
- スロットリングされず、 SpamLookup プラグインによる判定へ
- SpamLookup プラグインにてスパムと判定される
- 「迷惑コメント」としてデータベースに記録される
- SpamLookup プラグインにてスパムと判定されない
- コメントとしてデータベースに記録され、 weblog 内に公開される
- SpamLookup プラグインにてスパムと判定される
- スロットリングされず、 SpamLookup プラグインによる判定へ
- 同じ IP アドレスからの連続したコメントが 8 個に達するまでの時間が
- ThrottleSeconds*10-1 秒よりも小さい
- スロットリングされ、それ以上のコメントはデータベースに記録されない
- ThrottleSeconds*10-1 秒よりも大きい
- スロットリングされず、 SpamLookup プラグインによる判定へ
- SpamLookup プラグインにてスパムと判定される
- 「迷惑コメント」としてデータベースに記録される
- SpamLookup プラグインにてスパムと判定されない
- コメントとしてデータベースに記録され、 weblog 内に公開される
- SpamLookup プラグインにてスパムと判定される
- スロットリングされず、 SpamLookup プラグインによる判定へ
- ThrottleSeconds*10-1 秒よりも小さい
- ThrottleSeconds ディレクティブの値よりも短い間隔で投稿される
手動によるコメント投稿の場合でも、極端に短い間隔であればスロットリングされます。 また、機械的なコメントスパムの場合は、同一 IP から 8 個以上のコメント投稿があった場合に、より長い時間でスロットリング判定を行います。
トラックバックに対する Throttling の流れ
次に、トラックバックが連続して寄せられた場合の流れを考えてみましょう。 Ogawa::Memoranda の (o) さんからコメントをいただいて、誤っていた点を書き直しました。
- 1 時間以内に送信された ping の数が OneHourMaxPings ディレクティブの値よりも多いか、あるいは ThrottleSeconds*4000+1 秒以内に送信された ping の数が OneDayMaxPings ディレクティブの値よりも多い
- スロットリングされ、データベースに記録されない
- 1 時間以内に送信された ping の数が OneHourMaxPings ディレクティブの値よりも少なく、かつ ThrottleSeconds*4000+1 秒以内に送信された ping の数が OneDayMaxPings ディレクティブの値よりも少ない
- スロットリングされず、 SpamLookup プラグインによる判定へ
- SpamLookup プラグインにてスパムと判定される
- 「迷惑トラックバック」としてデータベースに記録される
- SpamLookup プラグインにてスパムと判定されない
- トラックバックとしてデータベースに記録され、 weblog 内に公開される
- SpamLookup プラグインにてスパムと判定される
- スロットリングされず、 SpamLookup プラグインによる判定へ
OneHourMaxPings と OneDayMaxPings
トラックバックの場合は
ThrottleSeconds において IP アドレスのチェックを行わないため、
OneHourMaxPings および OneDayMaxPings というディレクティブを用いて、 1 時間あたり、あるいは 1 日あたりの最大の ping 数の制限を行っています。
OneHourMaxPings ディレクティブの初期値は 10 となっているため、「 1 時間以内に 10 回 ping 送信が行われた場合、以降の ping 送信についてはスロットリングを行う」ということになり、「http://www.example.com/mt/mt-tb.cgi/***」へのトラックバックは失敗しました: HTTP error: 403 Throttled というエラーメッセージを返すことになります。
また、 OneDayMaxPings ディレクティブの初期値は 50 となっているため、「 1 日以内に 50 回 ping 送信が行われた場合、以降の ping 送信についてはスロットリングを行う」ということになり、「http://www.example.com/mt/mt-tb.cgi/***」へのトラックバックは失敗しました: HTTP error: 403 Throttled というエラーメッセージを返すことになります。 なお、この場合の 1 日は 24 時間ではなく、 ThrottleSeconds*4000+1 秒ということになっているようです。 ( 先生、最近トラックバックスパムがひどいんです。 - Ogawa::Memoranda ) よって、例えば ThrottleSeconds を 60 にしていた場合、 60*4000+1=240001 ということで、 240001 秒が OneDayMaxPings の判定基準となります。 しかし、 ThrottleSeconds によるスロットリングは行わないのに、そのディレクティブの値が OneDayMaxPings に影響を及ぼすというのもおかしな話ですね……。
最近のスパムトラックバックのペースを考える限り、 1 日に 50ping という制限ではあっという間にスロットリングの基準に達してしまいます。 そして、 ThrottleSeconds の値によってはスロットリングを行う状態が 1 日以上続き、仮に解除状態になってもすぐスパムトラックバックによって再びスロットリングを行う状態になると思われます。
管理者向けの mt-config.cgi 設定ガイド
以上を踏まえて、正規のトラックバックでも HTTP error: 403 Throttled を発生させないようにする mt-config.cgi の設定を考えてみました。
- ThrottleSeconds
-
OneDayMaxPings との兼ね合いを考え、 20 以下を目安に設定 !
- OneHourMaxPings
-
これはあまり大きくするとスパムトラックバックをスロットリングしなくなるので、初期値 (10) よりも小さくしても良いかも ? これまでのトラックバックの受付実績を考えて設定 !
- OneDayMaxPings
-
昨今のスパムトラックバック事情を考えて、初期値 (50) よりも大きく設定 ! 特に ThrottleSeconds をやむなく大きく設定している場合はそれに比例して大きく設定してください。 でないと常時スロットリング状態になります。
しかし、 OneHourMaxPings と OneDayMaxPings って、大きくすればそれだけスパムトラックバックを通しやすくなるし、かといってあまりにも小さくすると正規のトラックバックをスロットリングしてしまうし、悩ましいですね。
MT::App::Trackback.pm を修正するという手段もアリ
また、 ThrottleSeconds ディレクティブによるスロットリングで、同一 IP のチェックを行わないという仕様を、同一 IP のチェックを行うようにする、という解決方法もあります。
MT::App::Trackback.pm にパッチをあてるというのがその解決方法ですが、 3.2-ja-2 UO Patch - Ogawa Code にて Movable Type 3.2 用のアンオフィシャルパッチが公開されています。 Movable Type 3.3 用のパッチは公開されてないようなので、そのソースを参考にするか、あるいはそのパッチの元になったここギコ!: MovableType 3.2、MT::App::Trackback.pmの修正という記事を参考にして MT::App::Trackback.pm を修正すると良いでしょう。
FAQ ももう少し詳しく書いて欲しいなあ
実は、 9 月 4 日付けで技術的なよくある質問の中に、エラー「HTTP error: 403 Throttled」でトラックバック送信に失敗するという記事が投稿されていました。
が、回答としては
トラックバック先において、何らかの制限を設けている場合や、トラックバックを拒否するような設定が行われている場合にトラックバックが失敗することがあります。
トラックバック先における受信設定については、該当のサイト管理者にお問い合わせください。
とだけ書かれてあるだけで、サイト管理者に対してどの設定を問い合わせて良いかなかなか分かりません。
管理者に mt-config.cgi のどのディレクティブを確認してもらえば良いかを書くか、あるいはマニュアルの該当部分へのリンクを書いてもらえば親切なのになあ……と思いました。
トラックバック送信先
- エラー「HTTP error: 403 Throttled」でトラックバック送信に失敗する
-
回答部分に、 ThrottleSeconds および OneHourMaxPings と OneDayMaxPings ディレクティブについての解説あるいはマニュアルへのリンクを添えてもらうとより分かりやすくなると思います。

