FORM の action の URI にクエリをつけたまま GET で送信できなかったのでなんでか調べてみた

あれ?タイトルわかりづらい?

要はこういうことです

  1 <html>
  2 
  3 <body>
  4   <form method="GET" action="./form.html?key1=value1">
  5     <input type="text" name="key2" value="value2" />
  6     <input type="submit" value="test" />
  7   </form>
  8 </body>
  9 
 10 </html>

これでボタン押したときにクエリとして

  • key1 : value1
  • key2 : value2

が送られてきてほしいのです
しかし、結果として key2 しか送られてきません
...おい、key1 どこいった?
というわけでアクセスログを見てみると

::1 - - [25/Jul/2010:23:06:04 +0900] "GET /~xxx/form.html?key2=value2 HTTP/1.1" 200 191

となっています。はい、 key1 どっかに消えました

そこで以下のように GET, POST の両方を作って実験してみました

  1 <html>
  2 
  3 <body>
  4   <form method="GET" action="./form.php?key1=value1">
  5     method : GET <br />
  6     <input type="text" name="key2" value="value2" />
  7     <input type="submit" value="test" />
  8   </form>
  9 
 10   <form method="POST" action="./form.php?key1=value1">
 11     method : POST <br />
 12     <input type="text" name="key2" value="value2" />
 13     <input type="submit" value="test" />
 14   </form>
 15 
 16   <pre>
 17     $_GET : <?php var_dump($_GET); ?>
 18   </pre>
 19 
 20   <pre>
 21     $_POST : <?php var_dump($_POST); ?>
 22   </pre>
 23 
 24 
 25 </body>
 26 
 27 </html>

GET の結果

    $_GET : array(1) {
  ["key2"]=>
  string(6) "value2"
}
  
    $_POST : array(0) {
}

POST の結果

    $_GET : array(1) {
  ["key1"]=>
  string(6) "value1"
}
  
    $_POST : array(1) {
  ["key2"]=>
  string(6) "value2"
}

ここからわかる状況

  • GET : action で指定した URL の ? 以下を無視している
  • POST : action で指定した URL の通りに動作している


なんでこのようなことになっているのかは調べきれなかったので、また今度調べます
なんとなくブラウザの仕様なんじゃないかなーと思ったりもしました
(あれ?ブラウザの仕様なら HTML の定義のどっかに書いてあるのかな。。。でも見つけられんかった。。。

参考
http://labs.uechoco.com/blog/2007/11/htmlformactionget.html
http://chaichan.web.infoseek.co.jp/perlnote/perlnote2010-05-31.htm