29-Sep-2011 04:48
http://www.domain.com/dir/file.htm
I was anticipating only seeing
/dir/file.htm
Can anybody explain what is happening here? This goes against everything I thought I understood about HTTP::uri.
Thanks
fergu5
29-Sep-2011 07:40
An HTTP request can contain an absolute URI per RFC2616:
http://tools.ietf.org/html/rfc2616section-5.1.2
5.1.2 Request-URI
The Request-URI is a Uniform Resource Identifier (section 3.2) and
identifies the resource upon which to apply the request.
Request-URI = "*" | absoluteURI | abs_path | authority
The four options for Request-URI are dependent on the nature of the
request. The asterisk "*" means that the request does not apply to a
particular resource, but to the server itself, and is only allowed
when the method used does not necessarily apply to a resource. One
example would be
OPTIONS * HTTP/1.1
The absoluteURI form is REQUIRED when the request is being made to a
proxy. The proxy is requested to forward the request or service it
from a valid cache, and return the response. Note that the proxy MAY
forward the request on to another proxy or directly to the server
specified by the absoluteURI. In order to avoid request loops, a
proxy MUST be able to recognize all of its server names, including
any aliases, local variations, and the numeric IP address. An example
Request-Line would be:
GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
To allow for transition to absoluteURIs in all requests in future
versions of HTTP, all HTTP/1.1 servers MUST accept the absoluteURI
form in requests, even though HTTP/1.1 clients will only generate
them in requests to proxies.
You can detect a relative URI by checking if HTTP::uri or HTTP::path start with "/". If not, it should be an absolute URI. You can use the URI:: commands to parse an absolute URI into the protocol, host and relative URI/path:
http://devcentral.f5.com/wiki/iRules.URI.ashx
http://devcentral.f5.com/wiki/iRules.URI__path.ashx
http://devcentral.f5.com/wiki/iRules.URI__host.ashx
Aaron
30-Sep-2011 02:18
Hey Hoolio,
Firstly, can I just say that my friend LyonsG and I are continually impresses by your seemingly endless knowledge and your everpresence on DevCentral - do you ever sleep?;-P Thanks for taking the time to help 😉
Secondly your excerpt from the RFC answers my question. This latest project I'm working on is to load balance some proxy servers! So the quote...
The absoluteURI form is REQUIRED when the request is being made to a proxy.
nails it;-D
I have been writing iRules for a fair while (admittedly never in relation to proxy servers) but I have not come across this absoloute format when using HTTP::uri.
I think the Wiki page for HTTP::uri could really do with being updated to include a reference to the quote from your previous reply or the full RFC.
At the moment the Wiki page suggests the HTTP::uri will return something beginning with / i.e. something relative. If you read closely the Wiki page does says 'typically' but I only spotted this in hindsight and I imagine others have missed it too.
What do you think?
fergu5
30-Sep-2011
09:42
- last edited on
05-Jun-2023
08:41
by
JimmyPackets
For now, you can add logic to your iRule to handle relative and absolute URIs:
http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/asg/50/aft/1178966/showtab/groupforums...
when HTTP_REQUEST {
Check for an absolute URI
if {not ([HTTP::uri] starts_with "/")}{
if {[scan $abs_uri {%[^/]//%[^/]%s} proto host uri] == 3}{
Log the URI to a local URI
log local0. "\$proto: $proto, \$host: $host, \$uri: $uri"
}
}
}
Aaron
30-Sep-2011 11:24