When a user first hits our server, we want to capture some information about the incoming request: GET
parameters, Referer
header, &c. The general idea is that when we get an incoming request that matches some RewriteCond
s (doesn't have a cookie, doesn't have a particular GET
param in case they don't accept cookies, &c.), we use a RewriteRule
with [P]
to transparently proxy the request to a servlet (actually a Spring controller, if that matters) that will analyse the incoming request, then send a 302, with a new cookie set, to redirect the user to the originally requested URL. That is,
- User requests
/foo.html
mod_rewrite
detects that this is the user's first request (no cookie, noGET
flag param)- A
RewriteRule
with[P]
proxies to/my/spring/controller
- Servlet analyses the request and responds with a 302 to
Location: /foo.html
.
The first three steps are simple enough. The problem is that in step four, the servlet has no idea that /foo.html
was ever requested, which means (a) it can't record the fact that such was the case (a business requirement) and (b) it doesn't know where to redirect. We can see which server was requested in X-Forwarded-Host
et al, but looking at the request URL just shows /my/spring/controller
.
What we want to achieve, then, is ideally a proxy pass transparent not just to the client but to the receiving servlet as well.
One option is to pass the URL in an environment variable with something like [E=FOO:REQUEST_URI]
. However, this increases the complexity of the servlet, and it's not obvious to me whether the request is otherwise unchanged. The point of the servlet is to analyse the request coming from the client, preferably unchanged by Apache. If mod_rewrite
changed the request URL, can I trust all other aspects of the request to be unchanged?