mod_rewrite,重定向并设置cookie,防止重定向循环

问题描述 投票:0回答:1

我现在被困在这里几个小时...任何帮助将不胜感激!

我需要做什么:

有一个应用需要“保护”。这意味着我需要显示一个“免责声明”页面,它不是受保护应用程序本身的一部分,而是在同一个域/服务器下。此免责声明页面需要每8小时向每位访客显示。

我的理念:

  1. 在Apache中,在每个请求中,检查是否存在“截获”的特定cookie。
  2. 如果有cookie,只需处理请求的URL而不做任何更改。
  3. 如果没有cookie,并且网址不是catch.html,则重定向到/catch.html?intercepted_url={requerst_uri_with_params}。在同一步骤中,设置cookie。
  4. 浏览器将设置cookie,按照重定向并加载catch.html(cookie已经存在),用户将在此页面上看到免责声明。
  5. 在catch.html上,使用JavaScript,cookie“截获”将更新为8小时的生命周期
  6. 在catch.html上,使用JavaScript,将呈现一个链接,指向截获的URL。
  7. 用户将单击创建的链接并向先前截获的请求发出新请求
  8. 每:1

到目前为止我尝试了什么:

Apache配置:

# Exclude the catch destination in order to prevent a redirect loop
RewriteCond %{REQUEST_URI} !/catch.html
# Check if the cookie "intercepted" is missing
RewriteCond %{HTTP_COOKIE} !intercepted
# Redirect and append the original url as request parameter, preserving params, and setting the cookie
RewriteRule ^(.*)$ /catch.html?intercepted_url=$1 [QSA,R=301,CO=intercepted:TRUE:%{HTTP_HOST}]

目前的结果:

  1. 打开http://local.example.com/foo/bar/baz.html?a=b&x=z&1=2会导致重定向,正如预期的那样,好的
  2. 现在应该通过重试第一个网址,因为设置了cookie,但是没有,我被困在免责声明页面上:(

任何想法如何解决这一问题?谢谢大家!

apache mod-rewrite cookies
1个回答
0
投票

这个概念按预期工作。重定向按照描述执行,但浏览器已缓存重定向,因为它是永久重定向(301)。解决方案是使用临时重定向(302)。

我最终还存储了cookie中截取的网址,以保持网址清洁。但我没有设法通过重定向设置cookie的实时时间。似乎没有办法在重写规则中计算它。我用了一些javascript来重写catch页面上的cookie。

© www.soinside.com 2019 - 2024. All rights reserved.