Как использовать правило перезаписи, чтобы проверить дату в куки? - PullRequest
2 голосов
/ 08 июля 2010

Я обнаружил, что вы не можете использовать обратную ссылку RewriteCond в качестве условия шаблона в следующем Rewrite Cond ...

То, что у меня выглядит правильно, но Тим прав в комментарии ниже ... Это все еще проходит, когда у нас заканчивается срок годности, сохраненный в куки.

Любые идеи о том, как на самом деле проверить значение вместо существования?

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 ]

6 голосов
/ 11 июля 2010

Хорошо, так получается, что теоретически вы можете сделать эту работу. Однако, и позвольте мне подчеркнуть это очень четко, ни при каких обстоятельствах не делает этого .

По сравнению с использованием сценария, использованием поддерживаемой программой 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

Если у кого-то есть более простой способ или он может предложить способ, которым это можно упростить еще больше, я весь в ушах. Я, вероятно, совершил преступление против человечества, написав это чудовище, но, по крайней мере, мы можем сказать, что сейчас это невозможно.

1 голос
/ 09 июля 2010

Кроме дополнительных .* с в последних двух правилах, это выглядит хорошо для меня. Что вы ожидаете после расширений?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...