Назад | Перейти на главную страницу

Прозрачный редирект или прокси в Apache с сохранением входящего запроса

Когда пользователь впервые попадает на наш сервер, мы хотим получить некоторую информацию о входящем запросе: GET параметры, Referer заголовок и т. д. Общая идея состоит в том, что когда мы получаем входящий запрос, RewriteConds (нет файла cookie, нет конкретного GET param в случае, если они не принимают файлы cookie и т. д.), мы используем RewriteRule с участием [P] чтобы прозрачно проксировать запрос сервлету (фактически контроллеру Spring, если это имеет значение), который будет анализировать входящий запрос, а затем отправить 302 с новым набором файлов cookie, чтобы перенаправить пользователя на изначально запрошенный URL. То есть,

Первые три шага достаточно просты. Проблема в том, что на четвертом шаге сервлет не знает, что /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]