このフォームを考えてみましょう:
<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.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」コンテンツタイプを使用してエンコードされたフォームデータセットを追加します。
おそらく、action-URLをパーセントエンコードして疑問符とパラメーターを埋め込んでから、すべてのブラウザーがそのURLをそのままにしておくことを望みます(そしてサーバーがそれも理解していることを検証します)。しかし、私はそれに依存することはありません。
ちなみに、非表示ではないフォームフィールドでも同じです。POSTの場合、アクションURLはクエリ文字列を保持できます。
HTML5では、これは仕様ごとの動作です。
http://www.w3.org/TR/2011/WD-html5-20110525/association-of-controls-and-forms.html#form-submission-algorithmを参照してください
「4.10.22.3フォーム送信アルゴリズム」のステップ17をご覧ください。クエリ文字列を含むhttp / s URIへのGETフォームの場合:
destinationを、アクションに等しい新しいURLにします。ただし、
<query>
コンポーネントはクエリに置き換えられます(必要に応じてU + 003FのQUESTION MARK文字(?)を追加します)。
したがって、ブラウザはURIの既存の「?...」部分を破棄し、フォームに基づいて新しいURIに置き換えます。
HTML 4.01では、仕様により無効なURIが生成されますが、ほとんどのブラウザーは実際にはこれを行いませんでした。
http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3のステップ4を参照してください -URIには?すでに含まれている場合でも、追加されます。
?
つまり、アクションURLの背後にあるすべてが削除されますか?では、アクションURLのGETパラメータに、フォームを処理する必要があるターゲットが含まれている場合はどうなるでしょうか。のように:action="index.php?site=search"
。GETパラメータを非表示の入力フィールドに配置することが神の考えであるかどうかはわかりません。
できることは、GET情報を含むテーブルで単純なforeachを使用することです。たとえばphpの場合:
foreach ($_GET as $key => $value) {
echo("<input type='hidden' name='$key' value='$value'/>");
}
2つの項目(aおよびb)をCと同様に非表示の入力要素として含める必要があります。
Location:
か、エンドユーザーとのやり取りを望まない場合はサーバーリダイレクトに置き換えます。
フォームアクションの場合、次のような非常に類似した問題がありました。
<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を修正できることです。