フォームが処理されると、の値$form_state['redirect']がに送信されdrupal_goto()、drupal_goto()常に$_GET['destination']独自の$pathパラメーターよりも優先されます。
完全を期すために、Drupal 6では、独自のヘッダーをhook_exit()次のように設定せずに運が悪かったのです。
function mymodule_exit($destination = NULL) {
  $my_destination = 'foo/bar';
  header('Location: ' . url($my_destination));
  exit;
}
Drupal 7では、hook_drupal_goto_alter()この特定のユースケースのために追加されました:
function mymodule_drupal_goto_alter(&$path, &$options, &$http_response_code) {
  $path = 'foo/bar';
}
Drupal 7のもう1つのオプションは、目的に近いもので、次drupal_get_destination()  を使用して送信ハンドラーの静的キャッシュをリセットすることですdrupal_static_reset()。
function mymodule_form_submit($form, &$form_state) {
  // See note
  $form_state['redirect'][] = drupal_get_destination();
  $form_state['redirect'][] = 'foo/bar';
  unset($_GET['destination']);
  drupal_static_reset('drupal_get_destination');
  drupal_get_destination();
}
drupal_get_destination()リセット後すぐに呼び出すので、Drupalはを呼び出すときを含め、ページビルドの残りの部分の宛先パラメーターをまったく気付きませんdrupal_goto()。
注:$form_state['redirect']変数を上書きしたくないため、定義のコードを変更しました。他の送信ハンドラーが独自のリダイレクトを定義している場合があります。Drupalは常に配列の最後の項目を使用するためfoo/bar、宛先パラメーター(およびその時点までに定義された他のすべてのリダイレクト)をオーバーライドする場合は、最後にする必要があります。