Sunday, February 16, 2003
Query Redirects in HTTP, or rather, the lack of documentation thereof
Over the past few days, Mark and I have been going back
and forth about implementation details in Seminole. It started
out with a question about encoding URLs—when do you convert a space to %20
and when do you covert it to +
(answer: you can always use
%20
but you can only convert a space to a +
in the
query
portion of a URL) but eventually got around to a point not covered in
RFC-2616.
I like your idea of storing the query separate in the
HttpdRequest
object. It's a good idea, and I think may fix a problem where we do redirects and forget to tack on the query string. For example:Redirecting
http://server/some/directory?stuff
-to-
http://server/some/directory/index.html?stuff
Probably doesn't work now.
Email from Mark
Only thing is, RFC-2616 doesn't cover this situation. Sure, it
covers what to do when redirecting a POST
(and even goes into
mind-numbing detail about when and when not to convert a POST
to a GET
when redirecting, and how that interacts with proxy
and caching servers) but not what to do when redirecting a GET
with a query.
I did some tests with Apache, and from what I can see, if
Apache generates the redirect (for example,
http://www.example.net/path
to
http://www.example.net/path/
) it passes along the query
string (http://www.example.net/path?a=1&b=2
is redirected
to http://www.example.net/path/?a=1&b=2
)
but if the redirect comes from the Redirect
directive
(for example, http://www.example.net/p.cgi
to
http://server.example.org/q.cgi
), then the query portion of the
URL is dropped entirely
(http://www.example.net/p.cgi?a=1&b=2
is redirected to
http://server.example.org/q.cgi
—note the missing query
string) and since the RFC is
quite mum on what the correct behavior is, we're having to wing it for
now.