269

次のフォームを検討してください。

<form action="http://www.blabla.com?a=1&b=2" method="GET">
    <input type="hidden" name="c" value="3" /> 
</form>

このGETフォームを送信すると、パラメーターabが消えます。
その理由はありますか?
この動作を回避する方法はありますか?

4

11 に答える 11

304

そもそも隠しパラメータとは…?

<form action="http://www.example.com" method="GET">
  <input type="hidden" name="a" value="1" /> 
  <input type="hidden" name="b" value="2" /> 
  <input type="hidden" name="c" value="3" /> 
  <input type="submit" /> 
</form>

アクション URL に既存のクエリ文字列を保持しているブラウザーは期待できません。

仕様 ( RFC1866、ページ 46; HTML 4.xセクション 17.13.3) の状態:

メソッドが「get」で、アクションが HTTP URI の場合、ユーザー エージェントはアクションの値を取得し、「?」を追加します。それに、「application/x-www-form-urlencoded」コンテンツ タイプを使用してエンコードされたフォーム データ セットを追加します。

アクション URL をパーセント エンコードして疑問符とパラメーターを埋め込み、すべてのブラウザーがその URL をそのままにしておく (そしてサーバーもそれを理解することを検証する) ことを期待することができます。しかし、私はそれに頼ることは決してありません。

ところで、非表示でないフォーム フィールドでも違いはありません。ただし、POST の場合、アクション URL はクエリ文字列を保持できます。

于 2009-07-12T13:15:19.890 に答える
83

HTML5 では、これは仕様ごとの動作です。

コントロールとフォームの関連付け - フォーム送信アルゴリズム を参照してください。

「4.10.22.3 フォーム送信アルゴリズム」のステップ 17 を参照してくださいhttp/s。クエリ文字列を含む URI への GET フォームの場合:

宛先をアクションと同じ新しい URL にしますが、その<query>コンポーネントはクエリに置き換えられます (必要に応じて QUESTION MARK 文字を追加します) U+003F(?)

したがって、ブラウザーは"?..."URI の既存の部分を破棄し、フォームに基づいて新しいものに置き換えます。

HTML 4.01 では、仕様により無効な URI が生成されます - ほとんどのブラウザは実際にはこれを行いませんでした...

フォーム - フォーム データの処理 のステップ 4を参照してください。URI?に が既に含まれている場合でも、追加されます。

于 2012-03-27T02:53:32.810 に答える
14

できることは、GET 情報を含むテーブルで単純な foreach を使用することです。たとえば、PHP の場合:

foreach ($_GET as $key => $value) {
    $key = htmlspecialchars($key);
    $value = htmlspecialchars($value);
    echo "<input type='hidden' name='$key' value='$value'/>";
}

GET 値はユーザーから取得されるため、画面に出力する前にエスケープする必要があります。

于 2012-01-06T19:53:10.810 に答える
5

C と同様に、2 つの項目 (a と b) を非表示の入力要素として含める必要があります。

于 2009-07-12T13:16:10.903 に答える
0

フォームアクションの場合、次のような非常によく似た問題がありました。

<form action="http://www.example.com/?q=content/something" method="GET">
   <input type="submit" value="Go away..." />&nbsp;
</form>

ボタンはユーザーをサイトに誘導しますが、クエリ情報が消えたため、ユーザーは目的のコンテンツ ページではなくホームページに移動しました。私の場合の解決策は、クエリを使用せずに URL をコーディングして、ユーザーを目的のページに移動させる方法を見つけることでした。この場合、私のターゲットは Drupal サイトだったので、それ/content/somethingもうまくいきました。ノード番号 (つまり ) を使用することもできます/node/123

于 2011-09-07T17:26:24.533 に答える
-2

あなたの建設は違法です。フォームのアクション値にパラメーターを含めることはできません。これを試してみるとどうなるかは、ブラウザの癖に依存します。あるブラウザで動作し、別のブラウザでは動作しなかったとしても、私は驚かないでしょう. 動作しているように見えても、ブラウザーの次のバージョンで動作が変わる可能性があるため、私はそれに依存しません。

「しかし、クエリ文字列と非表示の入力にパラメーターがあるとしましょう。どうすればよいでしょうか?」あなたができることは、エラーを修正することです。中傷するつもりはありませんが、これは「でも、URL でスラッシュの代わりにパーセント記号を使用しているとしたら、どうすればよいでしょうか?」と尋ねるようなものです。唯一可能な答えは、URL を修正できるということです。

于 2011-09-07T17:45:13.697 に答える