2010-07-08 40 views
2

我发现你不能在下一个Rewrite Cond中使用RewriteCond反向引用作为模式条件...如何使用重写规则在cookie中测试日期?

我看起来是正确的,但Tim在评论波纹管中是正确的......这仍然通过时我们超出了cookie中保存的有效日期。

关于如何实际测试值而不是存在的任何想法?

RewriteCond %{HTTP_COOKIE} niftyExpire=([^;\ ]+) 
RewriteRule .*index.html /fake.html [E=niftyExpire:%1,C] 
RewriteCond %{TIME} <{ENV:niftyExpire} 
RewriteRule .*fake.html /pass.html [R,L] 
RewriteRule .*index.html /fail.html [R,L] 

感谢,

-Eric

+0

顺便提一句,当'RewriteCond%{TIME} <{ENV:niftyExpire}'应该为false时,您是否测试了条件? 'mod_rewrite'不会扩展测试模式中的任何*变量,所以我不认为这会以您期望的方式工作(目前'RewriteCond'应该始终计算为true)。 – 2010-07-09 05:44:19

+0

您的正确,我实际上只是测试cookie的存在......任何想法?谢谢, – Eric 2010-07-09 13:29:19

+0

无可否认,这对于某种脚本来说确实是一项工作,因为'mod_rewrite'并不是特别适合这些类型的任务。然而,这并不意味着一个解决方案不存在...所以我会琢磨一下,看看是否有一些疯狂的规则集可以使这成为可能,因为这将是相当整洁(尽管有点不切实际,我敢肯定)。 – 2010-07-10 07:28:13

回答

6

好的,所以事实证明,你理论上可以做到这一点。但是,让我强调这一点很清楚,在任何情况下都不会这样做。与使用脚本相比,使用程序支持的RewriteMap(尽管并不总是可行),或者在编辑修改后的mod_rewrite的极端情况下,我只能想象这样的性能是绝对可怕的,并且由于它具有在每个请求中准备在.htaccess文件中使用时,这会导致不必要的大量开销。

话虽这么说,对于概念验证,132线mod_rewrite亵渎:

RewriteEngine On 

RewriteCond %{HTTP_COOKIE} niftyExpire=([^;\ ]+) [OR] 
RewriteCond fail ^(fail)$ 
RewriteRule index.html$ /fail.html [E=niftyExpire:%1,E=RW_TSTATUS:%1] 

RewriteCond %{ENV:RW_TSTATUS) !=fail 
RewriteCond %{ENV:niftyExpire} ^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})\d{2}$ 
RewriteRule .* - [E=RW_CYEAR:%1,E=RW_CMON:%2,E=RW_CDAY:%3,E=RW_CHOUR:%4,E=RW_CMIN:%5] 

# Check if current YY*YMMDDHHMM < cookie YY*YMMDDHHMM 
#(applicable only for this decade..but that's good enough) 
RewriteCond %{TIME_YEAR}%{ENV:RW_CYEAR} !^(\d{4})\1$ 
RewriteCond %{TIME_YEAR}%{ENV:RW_CYEAR} ^\d{2}(\d)\d{3}(\d)\d$ 
RewriteCond %1%2 ^(01|[01]2|[0-2]3|[0-3]4|[0-4]5|[0-5]6|[0-6]7|[0-7]8|[0-8]9)$ 
RewriteRule .* - [E=RW_TSTATUS:success] 

RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_YEAR}%{ENV:RW_CYEAR} ^\d{2}(\d)\d{3}(\d)\d$ 
RewriteCond %1%2 !^(\d)\1$ 
RewriteRule .* - [E=RW_TSTATUS:fail] 

# Check if current YYY*MMDDHHMM < cookie YYY*MMDDHHMM 
RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_YEAR}%{ENV:RW_CYEAR} !^(\d{4})\1$ 
RewriteCond %{TIME_YEAR}%{ENV:RW_CYEAR} ^\d{3}(\d)\d{3}(\d)$ 
RewriteCond %1%2 ^(01|[01]2|[0-2]3|[0-3]4|[0-4]5|[0-5]6|[0-6]7|[0-7]8|[0-8]9)$ 
RewriteRule .* - [E=RW_TSTATUS:success] 

RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_YEAR}%{ENV:RW_CYEAR} ^\d{3}(\d)\d{3}(\d)$ 
RewriteCond %1%2 !^(\d)\1$ 
RewriteRule .* - [E=RW_TSTATUS:fail] 

# Check if current YYYY*MDDHHMM < cookie YYYY*MDDHHMM 
RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_MON}%{ENV:RW_CMON} !^(\d{2})\1$ 
RewriteCond %{TIME_MON}%{ENV:RW_CMON} ^(\d)\d(\d)\d$ 
RewriteCond %1%2 ^01$ 
RewriteRule .* - [E=RW_TSTATUS:success] 

RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_MON}%{ENV:RW_CMON} ^(\d)\d(\d)\d$ 
RewriteCond %1%2 !^(\d)\1$ 
RewriteRule .* - [E=RW_TSTATUS:fail] 

# Check if current YYYYM*DDHHMM < cookie YYYYM*DDHHMM 
RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_MON}%{ENV:RW_CMON} !^(\d{2})\1$ 
RewriteCond %{TIME_MON}%{ENV:RW_CMON} ^\d(\d)\d(\d)$ 
RewriteCond %1%2 ^(01|[01]2|[0-2]3|[0-3]4|[0-4]5|[0-5]6|[0-6]7|[0-7]8|[0-8]9)$ 
RewriteRule .* - [E=RW_TSTATUS:success] 

RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_MON}%{ENV:RW_CMON} ^\d(\d)\d(\d)$ 
RewriteCond %1%2 !^(\d)\1$ 
RewriteRule .* - [E=RW_TSTATUS:fail] 

# Check if current YYYYMM*DHHMM < cookie YYYYMM*DHHMM 
RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_DAY}%{ENV:RW_CDAY} !^(\d{2})\1$ 
RewriteCond %{TIME_DAY}%{ENV:RW_CDAY} ^(\d)\d(\d)\d$ 
RewriteCond %1%2 ^(01|[01]2|[0-2]3)$ 
RewriteRule .* - [E=RW_TSTATUS:success] 

RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_DAY}%{ENV:RW_CDAY} ^(\d)\d(\d)\d$ 
RewriteCond %1%2 !^(\d)\1$ 
RewriteRule .* - [E=RW_TSTATUS:fail] 

# Check if current YYYYMMD*HHMM < cookie YYYYMMD*HHMM 
RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_DAY}%{ENV:RW_CDAY} !^(\d{2})\1$ 
RewriteCond %{TIME_DAY}%{ENV:RW_CDAY} ^\d(\d)\d(\d)$ 
RewriteCond %1%2 ^(01|[01]2|[0-2]3|[0-3]4|[0-4]5|[0-5]6|[0-6]7|[0-7]8|[0-8]9)$ 
RewriteRule .* - [E=RW_TSTATUS:success] 

RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_DAY}%{ENV:RW_CDAY} ^(\d)\d(\d)\d$ 
RewriteCond %1%2 !^(\d)\1$ 
RewriteRule .* - [E=RW_TSTATUS:fail] 

# Check if current YYYYMMDD*HMM < cookie YYYYMMDD*HMM 
RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_HOUR}%{ENV:RW_CHOUR} !^(\d{2})\1$ 
RewriteCond %{TIME_HOUR}%{ENV:RW_CHOUR} ^(\d)\d(\d)\d$ 
RewriteCond %1%2 ^(01|[01]2)$ 
RewriteRule .* - [E=RW_TSTATUS:success] 

RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_HOUR}%{ENV:RW_CHOUR} ^(\d)\d(\d)\d$ 
RewriteCond %1%2 !^(\d)\1$ 
RewriteRule .* - [E=RW_TSTATUS:fail] 

# Check if current YYYYMMDDH*MM < cookie YYYYMMDDH*MM 
RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_HOUR}%{ENV:RW_CHOUR} !^(\d{2})\1$ 
RewriteCond %{TIME_HOUR}%{ENV:RW_CHOUR} ^\d(\d)\d(\d)$ 
RewriteCond %1%2 ^(01|[01]2|[0-2]3|[0-3]4|[0-4]5|[0-5]6|[0-6]7|[0-7]8|[0-8]9)$ 
RewriteRule .* - [E=RW_TSTATUS:success] 

RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_HOUR}%{ENV:RW_CHOUR} ^(\d)\d(\d)\d$ 
RewriteCond %1%2 !^(\d)\1$ 
RewriteRule .* - [E=RW_TSTATUS:fail] 

# Check if current YYYYMMDDHH*M < cookie YYYYMMDDHH*M 
RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_MIN}%{ENV:RW_CMIN} !^(\d{2})\1$ 
RewriteCond %{TIME_MIN}%{ENV:RW_CMIN} ^(\d)\d(\d)\d$ 
RewriteCond %1%2 ^(01|[01]2|[0-2]3|[0-3]4|[0-4]5)$ 
RewriteRule .* - [E=RW_TSTATUS:success] 

RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_MIN}%{ENV:RW_CMIN} ^(\d)\d(\d)\d$ 
RewriteCond %1%2 !^(\d)\1$ 
RewriteRule .* - [E=RW_TSTATUS:fail] 

# Check if current YYYYMMDDHHM* < cookie YYYYMMDDHHM* 
RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_MIN}%{ENV:RW_CMIN} !^(\d{2})\1$ 
RewriteCond %{TIME_MIN}%{ENV:RW_CMIN} ^\d(\d)\d(\d)$ 
RewriteCond %1%2 ^(01|[01]2|[0-2]3|[0-3]4|[0-4]5|[0-5]6|[0-6]7|[0-7]8|[0-8]9)$ 
RewriteRule .* - [E=RW_TSTATUS:success] 

RewriteCond %{ENV:RW_TSTATUS} !fail|success 
RewriteCond %{TIME_MIN}%{ENV:RW_CMIN} ^\d(\d)\d(\d)$ 
RewriteCond %1%2 !^(\d)\1$ 
RewriteRule .* - [E=RW_TSTATUS:fail] 

RewriteCond %{ENV:RW_TSTATUS} !=fail 
RewriteRule .* /pass.html 

如果任何人有一个更简单的方法,或者可以建议某种程度上,这可以更简化,我所有的耳朵。我可能通过写这个怪物犯了一个危害人类的罪行,但至少我们可以说现在不是不可能的。

+0

哇!感谢您的:-) 我发现我的问题的另一个解决方案无关(检查对目录中的会员ID为每个活动成员的文件) 但这:-) 最佳超级创造性的解决方案, -Eric – Eric 2010-07-20 00:39:46

+0

AHAHAHA - +1在任何情况下都不要这样做。 – Josh 2010-11-10 21:50:33

1

除了额外.* S IN的最后两个规则,这对我来说很好。扩展后你期望什么?

+0

事实证明,mod_rewrite不会扩展测试模式中的任何变量,所以我只能有效地测试cookie的存在......关于如何实际测试值而不仅仅是存在的任何想法? – Eric 2010-07-09 13:33:56