views:

91

answers:

1

I came across the following URL today:

http://www.sfgate.com/cgi-bin/blogs/inmarin/detail??blogid=122&entry_id=64497

Notice the doubled question mark at the beginning of the query string:

??blogid=122&entry_id=64497

My browser didn't seem to have any trouble with it, and running a quick bookmarklet:

javascript:alert(document.location.search);

just gave me the query string shown above.

Is this a valid URL? The reason I'm being so pedantic (assuming that I am) is because I need to parse URLs like this for query parameters, and supporting doubled question marks would require some changes to my code. Obviously if they're in the wild, I'll need to support them; I'm mainly curious if it's my fault for not adhering to URL standards exactly, or if it's in fact a non-standard URL.

+4  A: 

Yes, it is valid. Only the first ? in a URL has significance, any after it are treated as literal question marks:

The query component is indicated by the first question mark ("?") character and terminated by a number sign ("#") character or by the end of the URI.

...

The characters slash ("/") and question mark ("?") may represent data within the query component. Beware that some older, erroneous implementations may not handle such data correctly when it is used as the base URI for relative references (Section 5.1), apparently because they fail to distinguish query data from path data when looking for hierarchical separators. However, as query components are often used to carry identifying information in the form of "key=value" pairs and one frequently used value is a reference to another URI, it is sometimes better for usability to avoid percent-encoding those characters.

http://tools.ietf.org/html/rfc3986#section-3.4

Amber
So does that mean that the first query parameter is named "?blogid" and not "blogid"? That could be fun...
GalacticCowboy
Interesting, thanks Amber - great answer!
Bungle
@GalacticCowboy - Yeah, the same thing just occurred to me. You are correct - Firebug confirms that the first query parameter is in fact `?blogid`. It actually appears to be a non-essential parameter, i.e. the page is served the same with any number of question marks there, or omitting the parameter entirely.
Bungle