Судя по логу, происходит следующее:
1. Загружается страничка "?game_id=125343&v=7" (1). На этой страничке стоит таймер (javascript), чтобы через 5 секунд загрузить "?game_id=125343&v=8". В случае, если для v=8 рендеринг engine решит, что страница не изменилась, он сделает редирект обратно, и браузер вытащит v=7 из кэша. Это я сделал такой солюшн, чтобы избежать перерисовки каждые 5 секунд, даже если ничего не изменилось. (Я знаю про Ajax, просто редиректы + кэш куда проще имплементировать, для прототипа такие варианты побеждают :)).
2. Примерно через 5 секунд я кликаю "начать новую игру" (2). Это ссылка "?game_id=125343&action=start_new". Страничка видит action=start_new и делает (3) редирект на "?game_id=747700&v=8". Это новая игра (747700).
3. Хром тут же грузит страничку с новой игрой (4). Но!
4. Через секунду срабатывает таймер у страницы, про которую хром должен был уже давно забыть, и по таймеру Хром загружает "?game_id=125343&v=8" (5). Аааа!!! Юзера откидывает на страницу с предыдущей игрой, как будто "начать новую игру" он не нажимал.
(1)
client-host-name.com - - [05/Mar/2011 20:01:05] Command: GET Path: /renju?game_id=125343&v=7
client-host-name.com - - [05/Mar/2011 20:01:05] "GET /renju?game_id=125343&v=7 HTTP/1.1" 200 -
(2)
client-host-name.com - - [05/Mar/2011 20:01:10] Command: GET Path: /favicon.ico
client-host-name.com - - [05/Mar/2011 20:01:10] "GET /favicon.ico HTTP/1.1" 404 -
client-host-name.com - - [05/Mar/2011 20:01:10] Command: GET Path: /renju?game_id=125343&action=start_new
(3)
Redirect to location: /renju?game_id=747700&v=8
client-host-name.com - - [05/Mar/2011 20:01:10] "GET /renju?game_id=125343&action=start_new HTTP/1.1" 301 -
(4)
client-host-name.com - - [05/Mar/2011 20:01:10] Command: GET Path: /renju?game_id=747700&v=8
client-host-name.com - - [05/Mar/2011 20:01:10] "GET /renju?game_id=747700&v=8 HTTP/1.1" 200 -
Not caching
(5)
client-host-name.com - - [05/Mar/2011 20:01:11] Command: GET Path: /renju?game_id=125343&v=8
client-host-name.com - - [05/Mar/2011 20:01:11] "GET /renju?game_id=125343&v=8 HTTP/1.1" 200 -
Caching
В качестве решения, я так понимаю, нужно запоминать в сессии пользователя, куда он недавно перешёл, и на всех страницах, куда есть редирект по таймеру, передавать параметром страницу, с которой он перешёл (или ещё версию), проверять, а не перешёл ли он уже с этой страницы куда-нибудь, и в этом случае повторять новый редирект. Или попросить Хром, чтобы починили баг. World is evil.
Ещё один солюшн - кажется, более правильный, это клики сделать такими, чтобы они вначале отключали таймер, а потом уже делали переход. Или переход вытащить в отдельную javascript-переменную, и сделать, чтобы клик просто модифицировал её на нужный url и ускорял триггер таймера.
P.S. А ещё - FYI web developer'ам - Хром по умолчанию кэширует редиректы. Т.е. если вы отвечаете на запрос 301, то надо явно передавать хедеры, чтобы отключить кэширование, если вы не хотите, чтобы в следующий раз Хром просто проигнорировал ваш редирект и выполнил запомненный переход. Это важно знать для сценария, если по редиректам вы делаете action processing.