fragmentを付けてGETした場合とか、サーバは環境変数のQUERY_STRINGとかをどう扱うべきなんだろう。
http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
...
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
...
Request-URI = "*" | absoluteURI | abs_path | authority
Hypertext Transfer Protocol -- HTTP/1.1
↑を見た感じ、fragment付きでリクエストされる事を想定してないように思えるんだけど、どうなんだろう。
とりあえず、実装(挙動)を見ようと言う事でテスト。Apache2で動くPHPプログラムで環境変数をダンプしてみたのが↓(プログラムとテスト結果)。
<?php /** /test/dump.php **/ echo "from \$_SERVER:\n"; echo "\tREQUEST_URI = " . $_SERVER["REQUEST_URI"] . "\n"; echo "\tQUERY_STRING = " . $_SERVER["QUERY_STRING"] . "\n"; echo "from \$_GET:\n"; var_dump($_GET); echo "use apache_getenv():\n"; echo "\tREQUEST_URI = " . apache_getenv("REQUEST_URI") . "\n"; echo "\tQUERY_STRING = " . apache_getenv("QUERY_STRING") . "\n"; /* ~% telnet localhost 80 Trying ::1... Connected to localhost. Escape character is '^]'. GET /test/dump.php?key=value&foo=bar#fragment HTTP/1.1 Host: locahost HTTP/1.1 200 OK Date: Thu, 21 Dec 2006 13:16:56 GMT Server: Apache/2.2.3 (Unix) mod_ssl/2.2.3 OpenSSL/0.9.8d DAV/2 PHP/5.2.0 X-Powered-By: PHP/5.2.0 Content-Length: 308 Content-Type: text/html from $_SERVER: REQUEST_URI = /test/dump.php?key=value&foo=bar#fragment QUERY_STRING = key=value&foo=bar from $_GET: array(2) { ["key"]=> string(5) "value" ["foo"]=> string(3) "bar" } use apache_getenv(): REQUEST_URI = /test/dump.php?key=value&foo=bar#fragment QUERY_STRING = key=value&foo=bar */ ?>
fragmentはQUERY_STRINGには含まれず、GETパラメータ(引数)にもくっつかない。foo="bar#fragment"として解釈されるケースってあるのかな?あったとして、それはRFC準拠ってこと?生#はコンポーネントのデリミタだからおかしい?
The generic syntax uses the slash ("/"), question mark ("?"), and number sign ("#") characters to delimit components that are significant to the generic parser's hierarchical interpretation of an identifier.
Uniform Resource Identifier (URI): Generic Syntax
IE6ではLocationで得たURLについては、fragmentが付いていてもそのままリクエストするらしい。世にあるプログラム(アプリケーション)では、これを踏まえた上で、それでも(fragment付きでリクエストされても)動く様に作られているのかな?それとも、『リクエストが悪い』ってことで、エラー扱い?
いろんなウェブサーバの挙動を見てみたいけど、Apache以外よく分かんないんだよなぁ。。。

