PHPのURI引数に対する挙動

ページ情報
制作日
2004-04-27
最終更新日
2004-04-27
参照用URI
http://www.arielworks.net/articles/2004/0427a
分野

XMLでは実態参照区切り子以外の「&(アンパサンド)」は実態参照(「&」もしくは「&」)に置き換える必要がある。この決まりはURI中に登場する場合――多くはGETメソッドでの引数の区切りに使われる――でも同様で、必要に応じてエスケープする必要がある。

URI中の「&」が原因で混乱が発生したため、W3Cは昔から区切り子として「;(セミコロン)」を使うように提案している。サーバ側の対応が進んでいないためユーザーエージェント側も「&」以外を送信することが出来ず、現在のところ移行の兆しは余り見られないが、将来的な事を考えるとこれから作るスクリプトでは「;」への対応も視野に入れておいた方が良いかもしれない。

PHPでの対応策

PHPの場合、比較的簡単にこれに対応できる。

まず、外部からきたURI引数をパースする際の区切り(配列$_GETにも使われる)に使う記号は

arg_separator.input foo

で設定可能だ。「foo」部分を「;」にしておけば「;」ごとに引数が分割され、配列に格納される。「foo」を「&;」にした場合「&」および「;」が同等に区切り子として扱われる(「&;」が1つの区切り子になるのではない)。

逆にPHPが生成するURIで区切りとして使われる区切り子は

arg_separator.output foo

で設定できる。先ほどと同様に「foo」を「;」にしておけば区切り子として「;」が挿入される。

注意すべきなのは「;」を区切り子として使用できるのは、これらの設定が行われているサーバで全てが完結している場合に限る、と言うことだ。

現在のところ、ほぼ全てのブラウザがURI引数の区切り子に「&」を用いる。また逆に、PHPの生成するURIの区切り子に「;」が使われていたとしても、そのURIが示すスクリプトが「;」に対応していない外部のスクリプトだった場合、これは完全に動作しなくなる。そのため、URIを生成する側のスクリプトと受け取る側のスクリプトがどちらも「;」を区切り子として認識している場合にのみ、「;」を単独で使用できるといえる。

現状では「&;」として「&」も区切り子として受け付け、URIを生成する際の区切り子には「&」を使うのが1番安全だろう。

なお、上記の設定ディレクティブはphp.ini内の場合の記述方法だ。.htaccess内で設定する場合は行頭に

php_value 

を付けておこう。

連絡先、リンク、転載や複製などについては「サイト案内」をご覧ください。Powered by HIMMEL