注)激しく的外れな事を書いている気がします。
知らなかった。。。というか、fragmentって言葉を知らなかった(ハッシュとかページ内アンカーとか、適当に呼んでた)。
「Locationヘッダにfragmentを含めていいのかどうか」という疑問にぶつかって、Locationヘッダはabsolute-URIを利用可能という事で、じゃあOKだね、と。
Location = "Location" ":" absoluteURI
[RFC2616]Hypertext Transfer Protocol -- HTTP/1.1
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
[RFC3986]Uniform Resource Identifier (URI): Generic Syntax
URI?まあ、いいか。
absolute-URI = scheme ":" hier-part [ "?" query ]
[RFC3986]Uniform Resource Identifier (URI): Generic Syntax
駄目じゃん。。。URIで安心してabsolute-URIを見逃してた(嘘付きました、ごめんなさい)。
この疑問の切っ掛けは、「IE6でfragmentを含むURLのリダイレクトに失敗してるよ」と言われたから。
ヘッダを見てみると、↓。
Location: http://www.example.com/item?id=1234#price
...
GET http://www.example.com/item?id=1234#price HTTP/1.1
このときのレスポンスはプログラムが吐いているエラーページ。で、Firefoxだと、↓。
Location: http://www.example.com/item?id=1234#price
...
GET http://www.example.com/item?id=1234 HTTP/1.1
どうやら、Locationで受け取ったURLをGETする間で何かがあるらしい。で、エラーページが出てきたのは、クエリの解釈を期待通りに出来てない事が原因らしい。id="1234"を期待してるけど、id="1234#price"で渡ってる、と。
で、IE7で試すと問題がないらしい。ん?RFC2396->RFC3986で何か変わった?
URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
absoluteURI = scheme ":" ( hier_part | opaque_part )
[RFC2396]Uniform Resource Identifiers (URI): Generic Syntax
変わってない。じゃあ、HTTP/1.0かと思ってみても、Locationの記述は変化無し。
Location = "Location" ":" absoluteURI
[RFC1945]Hypertext Transfer Protocol -- HTTP/1.0
fragment付きURIにリダイレクトする場合、HTTPヘッダだけでは無理?
「動くから」を理由にしてLocationヘッダにfragment付きURIを利用して問題はないでしょうか?IE6については、「key=valuefragmentにしてしまえ」で。。。
「fragment込みのURIはユニークなリソースIDだ」と考える事は無茶なのかな。「RFC準拠ですから」でWeb利用者は納得出来るもの?
「RFCに従いつつ、fragment込みのURIにリダイレクトする方法」を考えないと、かなぁ。
。。。Web系開発に携わってるくせに、根っこを押さえられてない自分が憎い。。。
Locationヘッダに関する正誤表?
Location = "Location" ":" absoluteURI [ "#" fragment ]
HTTP/1.1 Specification Errata