urlquery-stringrfc3986rfc1738

Is question mark in URL part of query string?


TL;TR: Is (first) question mark in URL part of query or is is just a separator followed by query?

The RFC 1738, section 3.3, suggests that the "?" (question mark) is not part of the query string, but just separates it from the path:

http://<host>:<port>/<path>?<searchpart>

Grammar presented in the RFC 3986, Appendix A., also indicate the "?" is not part of the actual query string:

URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

Now, let's consider two URLs:

  1. http://server.com/api/item.json
  2. http://server.com/api/item.json?

Are they equivalent or distinct?

Is it valid to distinguish them and use to identify two different resources?


Solution

  • tl;dr:


    The URI standard (STD 66) is currently RFC 3986.

    Section 6.2. Comparison Ladder describes methods how to test if URIs are possibly equivalent.

    In 6.2.3. Scheme-Based Normalization it says:

    Normalization should not remove delimiters when their associated component is empty unless licensed to do so by the scheme specification. For example, the URI http://example.com/? cannot be assumed to be equivalent to any of the examples above.

    Where "examples above" refers to:

    http://example.com
    http://example.com/
    http://example.com:/
    http://example.com:80/
    

    (These 4 URIs are equivalent.)

    So http://example.com/api/item.json has no query component, while http://example.com/api/item.json? has an empty query component.