MW211 EXIT

devlog
PHP/(追記)formの飛び先パスについての注意
2013年11月17日
formタグのactionパラメータに、飛び先のURLを指定する場合、
それがファイルではなく、ディレクトリであった場合には
しっかり末尾に「/」をつけてあげなければならない。
┌─┬────────────────────────────────────┐
│×│<form method="post" action="/abc">                                      │
├─┼────────────────────────────────────┤
│○│<form method="post" action="/abc/">                                     │
└─┴────────────────────────────────────┘

さもないと、「301転送」が発生してしまう。
┌─┬────────────────┬───────────────────┐
│×│… "POST /abc HTTP/1.1" 301 …  │301 Moved Permanently(転送)           │
├─┼────────────────┼───────────────────┤
│○│… "POST /abc/ HTTP/1.1" 200 … │200 OK(正常)                          │
└─┴────────────────┴───────────────────┘
「301転送」が起きるとどうなるのか?POSTの中身が消えてしまう(引き継がれない)

(といっても、そうならないパスがあったりするから厄介だ)


つまり、formタグの「/」がないだけで、いくらsubmitしても
受信側で$_POSTでデータを拾えないという怪奇現象が発生してしまうのだ。
(といっても、そうならないパスがあったりするから、ますます怪奇現象だ)

【追記】
実はmod_rewriteを使っている場合の話だった。
abcを画面コントローラ名として扱っている場合、
htdocs配下に「abc」というフォルダがあると、
一旦「abc/」に「301転送」がされてしまう。

例えば「manual」というフォルダ配下にマニュアルのpdfか何かを格納しつつ
「Manual」というマニュアル画面の画面コントローラ名を使用すると
「/Manual」は、mod_rewriteが動作する前に、「manual」というフォルダに反応して
「/manual/」に「301転送」され、POSTが空っぽになってしまうわけだ。

教訓
・画面コントローラ名とフォルダ名は同じにしてはいけない
・フォルダ名を末尾の「/」なしで指定すると「301転送」される
分類:PHP