次のフォームを検討してください。
<form action="http://www.blabla.com?a=1&b=2" method="GET">
<input type="hidden" name="c" value="3" />
</form>
このGET
フォームを送信すると、パラメーターa
とb
が消えます。
その理由はありますか?
この動作を回避する方法はありますか?
そもそも隠しパラメータとは…?
<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 はクエリ文字列を保持できます。
HTML5 では、これは仕様ごとの動作です。
コントロールとフォームの関連付け - フォーム送信アルゴリズム を参照してください。
「4.10.22.3 フォーム送信アルゴリズム」のステップ 17 を参照してくださいhttp/s
。クエリ文字列を含む URI への GET フォームの場合:
宛先をアクションと同じ新しい URL にしますが、その
<query>
コンポーネントはクエリに置き換えられます (必要に応じて QUESTION MARK 文字を追加します)U+003F
。(?)
したがって、ブラウザーは"?..."
URI の既存の部分を破棄し、フォームに基づいて新しいものに置き換えます。
HTML 4.01 では、仕様により無効な URI が生成されます - ほとんどのブラウザは実際にはこれを行いませんでした...
フォーム - フォーム データの処理 のステップ 4を参照してください。URI?
に が既に含まれている場合でも、追加されます。
できることは、GET 情報を含むテーブルで単純な foreach を使用することです。たとえば、PHP の場合:
foreach ($_GET as $key => $value) {
$key = htmlspecialchars($key);
$value = htmlspecialchars($value);
echo "<input type='hidden' name='$key' value='$value'/>";
}
GET 値はユーザーから取得されるため、画面に出力する前にエスケープする必要があります。
C と同様に、2 つの項目 (a と b) を非表示の入力要素として含める必要があります。
フォームアクションの場合、次のような非常によく似た問題がありました。
<form action="http://www.example.com/?q=content/something" method="GET">
<input type="submit" value="Go away..." />
</form>
ボタンはユーザーをサイトに誘導しますが、クエリ情報が消えたため、ユーザーは目的のコンテンツ ページではなくホームページに移動しました。私の場合の解決策は、クエリを使用せずに URL をコーディングして、ユーザーを目的のページに移動させる方法を見つけることでした。この場合、私のターゲットは Drupal サイトだったので、それ/content/something
もうまくいきました。ノード番号 (つまり ) を使用することもできます/node/123
。
あなたの建設は違法です。フォームのアクション値にパラメーターを含めることはできません。これを試してみるとどうなるかは、ブラウザの癖に依存します。あるブラウザで動作し、別のブラウザでは動作しなかったとしても、私は驚かないでしょう. 動作しているように見えても、ブラウザーの次のバージョンで動作が変わる可能性があるため、私はそれに依存しません。
「しかし、クエリ文字列と非表示の入力にパラメーターがあるとしましょう。どうすればよいでしょうか?」あなたができることは、エラーを修正することです。中傷するつもりはありませんが、これは「でも、URL でスラッシュの代わりにパーセント記号を使用しているとしたら、どうすればよいでしょうか?」と尋ねるようなものです。唯一可能な答えは、URL を修正できるということです。