Когда пользователь впервые попадает на наш сервер, мы хотим получить некоторую информацию о входящем запросе: GET
параметры, Referer
заголовок и т. д. Общая идея состоит в том, что когда мы получаем входящий запрос, RewriteCond
s (нет файла cookie, нет конкретного GET
param в случае, если они не принимают файлы cookie и т. д.), мы используем RewriteRule
с участием [P]
чтобы прозрачно проксировать запрос сервлету (фактически контроллеру Spring, если это имеет значение), который будет анализировать входящий запрос, а затем отправить 302 с новым набором файлов cookie, чтобы перенаправить пользователя на изначально запрошенный URL. То есть,
/foo.html
mod_rewrite
обнаруживает, что это первый запрос пользователя (нет cookie, нет GET
параметр флага)RewriteRule
с участием [P]
прокси для /my/spring/controller
Location: /foo.html
.Первые три шага достаточно просты. Проблема в том, что на четвертом шаге сервлет не знает, что /foo.html
когда-либо был запрошен, что означает (а) он не может зафиксировать тот факт, что это было так (бизнес-требование) и (б) он не знает, куда перенаправить. Мы видим, какие сервер был запрошен в X-Forwarded-Host
и другие, но при просмотре URL-адреса запроса отображается /my/spring/controller
.
В таком случае, в идеале, мы хотим добиться прозрачности передачи прокси не только для клиента, но и для принимающего сервлета.
Один из вариантов - передать URL-адрес в переменной среды с чем-то вроде [E=FOO:REQUEST_URI]
. Однако это увеличивает сложность сервлета, и мне не очевидно, остается ли запрос неизменным. Задача сервлета - анализировать запрос, исходящий от клиента, желательно неизмененный Apache. Если mod_rewrite
изменил URL-адрес запроса, могу ли я доверять тому, что все остальные аспекты запроса останутся неизменными?
Доверяйте mod_rewrite, и, если параноик, передайте то, что вас интересует, вашему апплету в виде серии переменных CGI, например.
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP_COOKIE} !.........
RewriteRule /?foo.html /my/spring/controller?theRequest=%{THE_REQUEST}&requestURI=%{REQUEST_URI}&referer=%{HTTP_REFERER} [P,L]