2010-07-08 3 views
2

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

Что я имею выглядит правильно, но Тим правильно в комментариях внизу ... Это все еще проходит, когда мы находимся за пределами срока годности, сохраненного в файле 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] 

Спасибо,

-Эрик

+0

Вы протестировали условие, когда 'RewriteCond% {TIME} <{ENV: niftyExpire}' должно быть ложным, кстати? 'mod_rewrite' не расширяет * любые * переменные в тестовом шаблоне, поэтому я не думаю, что это будет работать так, как вы ожидаете (в настоящее время' RewriteCond' всегда должен быть равен true). –

+0

Ваш правильный, я эффективно тестирую только наличие печенья ... Любые идеи? Спасибо, – Eric

+0

По общему признанию, это действительно работа для какого-то скрипта, так как 'mod_rewrite' особенно не подходит для таких задач. Однако это не означает, что решение не существует ... Поэтому я собираюсь немного поработать с ним и посмотреть, есть ли какой-то сумасшедший набор правил, который сделает это возможным, поскольку это будет довольно аккуратно (хотя несколько непрактично, я уверен). –

ответ

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 против директории с файлом для каждого активного элемента) Но это супер-креативное решение :-) Best , -Эрик – Eric

+0

AHAHAHA - +1 для "не делайте этого ни при каких обстоятельствах". – Josh

1

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

+0

Как выясняется, mod_rewrite не расширяет какие-либо переменные в тестовом шаблоне, поэтому я эффективно тестирую только существование файла cookie ... Любые идеи о том, как на самом деле проверять ценность, а не просто существование? – Eric

Смежные вопросы