代码之家  ›  专栏  ›  技术社区  ›  Eric

如何使用重写规则测试cookie中的日期?

  •  2
  • Eric  · 技术社区  · 14 年前

    我发现在下一个重写条件中不能使用RewriteCond backreference作为模式条件。。。

    有没有关于如何真正检验价值而不是存在的想法?

    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]
    

    谢谢,

    -埃里克

    2 回复  |  直到 14 年前
        1
  •  6
  •   Tim Stone    14 年前

    好吧,所以从理论上来说,你可以做到这一点。不过,让我非常清楚地强调一下, 在任何情况下都不要这样做 .

    RewriteMap (尽管不总是可能),或在极端情况下编译修改的 mod_rewrite .htaccess 文件,这将导致不负责任的大量开销。

    也就是说,为了证明概念,132行 修改 亵渎:

    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
    

    如果有人有一个更简单的方法,或者可以建议一个更简单的方法,我洗耳恭听。我写这本书可能犯了反人类罪,但至少我们现在可以说这不是不可能的。

        2
  •  1
  •   Aaron Butacov    14 年前

    除了额外的 .* 在最后两条规则里,我觉得不错。延期后你期望什么?