お問合せフォームのパラメータが送信されない現象に対処
お問い合わせフォームのテストしてみたところ、入力内容がまったく送信されないということがありました。
不思議に思い、別名でコピーしてテストしてみたところ、うまく送信できました。
同じサーバー、同じプログラムなのに、現象がでる・出ないの違いが発生しました。
これは具合が悪いと思い、いろいろ調べて試してみたところ、原因がわかり対処することができました。
忘備録として記録いたします。
現象はこのような感じです。
まず現象を見るため、正しく動作するサンプルフォームをご覧ください。
送信ボタンを押すとメッセージが表示されます。
次に現象の発生するフォームをご覧ください。
送信ボタンを押しても何も発生しません。
プログラム側で何が起こっているのか調べてみました。
現象が発生する法は、プログラム側にパラメータが何も送信されていませんでした。
ちなみにHTMLソースはこのような感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<!doctype html> <html> <head> <meta charset="shift_jis"> <title>投稿テスト</title> <style type="text/css"> article { width: 800px; margin-right: auto; margin-left: auto; border: 1px solid #CCC; text-align: center; padding: 30px; border-radius: 6px; -webkit-border-radius: 6px; -moz-border-radius: 6px; } p { text-align: justify; } </style> </head> <body> <article> <section> <h1></h1> </section> <section> <form action="index.php" method="post" enctype="multipart/form-data"> <p>index.php名称だと、ボタンを押しても認識されません。</p> <input name="send" type="submit" value="送信"> <input name="reset" type="submit" value="リセット"> </form> </section> </article> </body> </html> |
ブラウザフォームからパラメータそのものが送信されない?
そんなことがあり得るのでしょうか?
原因は.htaccessのリダイレクト
現象が発生するフォームのファイル名称は、index.phpなのですが、これを別の名前に変更すると正しく動作しました。
また、index.phpに名前を戻すと現象が発生しました。
index.phpだと動作しないように見えました。
そこでピンときました。
フォームを入れているサーバーに、index.htmlとindex.phpは省略表示になるように、.htaccessでリダイレクト設定をしています。
つまり、送信ボタンを押した瞬間index.phpへパラメータを渡しますが、瞬時にリダイレクトされるためただの再表示になっているのです。
リダイレクトの瞬間、何もなかったことになる・・。
パラメータがプログラムに送信されない原因でした。
index.phpではない、別の名前に変えたときは正常に動いていたのもこのためです。
次のようにして対処しました。
index.phpリダイレクト設定があると、index.phpにパラメータ渡しをした瞬間にリダイレクトが発動します。
何とかするためには、リダイレクトが発動しないようにパラメータを渡せばよいのです。
そこで次のようにしました。
■現象が発生するHTML
1 |
<form action="index.php" method="post" enctype="multipart/form-data"> |
action(ボタンを押したときのとび先)がindex.phpになっています。
これを次のように変更しました。
1 |
<form action="" method="post" enctype="multipart/form-data"> |
“index.php” → “”と何もなしにすることでリダイレクト回避ができました。
このように変更したサンプルがこちらです。
ファイル名はindex.phpで、.htaccessでリダイレクト設定していますが、プログラム側にパラメータが送信されるようになりました。
疑問:actionを空欄にして問題ないのか?
ここで疑問がわきました。
actionを空欄にして問題ないのでしょうか?
そう思い調べてみたところ、次のようなことがわかりました。
- actionを空欄にすると、パラメータは自身へ送信される
- 一部のブラウザによっては強制的にディレクトリ(index.php)へ送信される
パラメータが自身へ送信されるとは?
空欄にすると自身へ送信されるとはどういうこと?
ということで実験しました。
次のサンプルはファイル名がsample.phpでindex.phpではありません。
そのうえで、actionを空欄にしてみました。
名称がindex.phpでなくてもaction空欄で送信されます。
呼び出した自身へ送信されています。
action空欄は一部のブラウザでは強制的にindex.phpに送信されることがある。
action空欄にはどうやら落とし穴があるとのことでした。
それが強制的にindex.phpを呼び出すというものです。
例えばsample.phpでaction空欄であったと場合、
送信ボタンを押すと、index.phpが呼び出されるというものです。
ガラケー時代のブラウザなど、ごく一部のブラウザに限定されるようです。
ただ、もともとindex.phpであれば問題はありません。
phpやHTMLに問題がなくても、意外なところに原因があるものです。
今回の現象が発生したとき、真っ先にプログラム側の受信パラメータを確認しました。
ところがプログラム側は何も受信していませんでした。
一体どうやって調査すればよいのだろうと、途方にくれました。
何とかできたのは、同じプロググラムでも現象が出る出ないの違いがあったことです。
その違いをひとつひとつ検証していったところ、.htaccessのリダイレクトにたどり着きました。
.htaccessを削除したらどうなるかを試したところ、正しく動作するようになったことが決め手でした。
なまじ経験値があると、原因を固定概念で探ってしまいがちです。
簡単なことでしたが、解決するのに思いのほか時間がかかりました。
ただ、多角的にいろんな角度からアプローチすれば、解決できるということを実感いたしました。