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

时间:2019-02-21 11:02:53

标签: apache mod-rewrite cookies

我现在在这里呆了几个小时……任何帮助将不胜感激!

我需要做什么:

有一个需要“保护”的应用程序。这意味着我需要显示一个“免责声明”页面,该页面不是受保护应用程序本身的一部分,而是在同一域/服务器下。此免责声明页面需要每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,现在应该重试第一个URL,但是没有,我被卡在了免责声明页面上:(

有什么办法解决此问题吗?预先谢谢大家!

1 个答案:

答案 0 :(得分:0)

该概念按预期工作。重定向已按照说明执行,但浏览器已将其缓存为永久重定向(301)。解决方案是使用临时重定向(302)。

我最终还是将拦截的URL存储在cookie中,以保持URL干净。但是我没有通过重定向设置cookie的生存时间。似乎没有办法在重写规则中进行计算。 我已经使用一些JavaScript重写了捕获页面上的cookie。