回答:
Drupal 6の場合
3番目のパラメーターである必要があります
drupal_goto($path = '', $query = NULL, $fragment = NULL, $http_response_code = 302)
drupal_goto("products", NULL, $node->nid);
Drupal 7の場合
drupal_goto($path = '', array $options = array(), $http_response_code = 302)
drupal_goto("products", array('fragment' => $node->nid));
Drupal 6では、drupal_gotoはフラグメンテーションに3番目のパラメーターを使用します。products#345のようなURLにしたい場合は、そのフラグメントをdrupal_goto関数の3番目の引数として渡す必要があります。
drupal_goto("products", NULL, $node->nid); // where $node->nid is the fragment.
Drupal 7では、フラグメントをdrupal_goto関数の2番目のパラメーターの配列のキー値ペアとして渡す必要があります。
drupal_goto('products', array('fragment' => $node->nid)) ; // where $node->nid is the fragment.
上記の両方で、products#123のようなURLが生成されます。123は$ node-> nid変数の値です。
drestal_gotoは、$ destroyが返されないため、?destination = foobar#zzzが存在する場合、#zzzを失います。
//$options['fragment'] = $destination['fragment']; // removed
is the same as
$options['fragment']='';