2011-12-10 11 views
5

Sto cercando di utilizzare il risultato di una funzione RewriteMap per consentire in modo condizionato l'accesso a una directory.
L'intenzione è di leggere un timestamp da un cookie (my_cookie) e passarlo nel RewriteMap (my_rewrite_map_func) che ho definito in httpd.conf (È un eseguibile che echos le stringhe "TRUE" o "FALSE" allo stdout se il il timestamp nel cookie si trova entro un certo intervallo di tempo corrente in Apache).Apache RewriteMap utilizzato per impedire l'accesso diretto ai file

RewriteMap my_rewrite_map_func prg:/var/www/program 

il contenuto del mio file .htaccess sono:

RewriteEngine On 
RewriteCond %{HTTP_COOKIE} my_cookie=([^;]+) [NC] 
RewriteCond ${my_rewrite_map_func:%{TIME}%1|FALSE},FALSE ^([^,]+),\1 [NC] 
RewriteRule ^(.*)$/[NC,L,QSA,F] 

Posso confermare che il programma stesso sta lavorando, il cookie viene letto, e il timestamp Apache e il timestamp dei cookie sono all'interno della intervallo consentito.

La regex sulla seconda verifica RewriteCond se il valore di ritorno di $ {my_rewrite_map_func:% {TIME}% 1 | FALSE} è falso, però, indipendentemente da ciò che ho impostato questo, il RewriteRule non si verifica mai.

In sostanza, non è possibile determinare come valutare il valore di $ {my_rewrite_map_func:% {TIME}% 1 | FALSE}. C'è un modo per estrarre o archiviare meglio il valore di questo?

Qualsiasi aiuto sarebbe più apprezzato.

UPDATE - SOLUZIONE: Non sono sicuro che il motivo per cui la questione è stata contrassegnata come fuori tema, si riferisce alla protezione dei file html da uno script php per mezzo di file di un Apache .htaccess utilizzando mod_rewrite di chiamare un programma C++ .

Indipendentemente da ciò, il codice precedente funziona perfettamente se usato in combinazione con due linee aggiuntive per gestire il caso del cookie non esistente:

RewriteCond %{HTTP_COOKIE} !^.*my_cookie.*$ [NC] 
RewriteRule ^(.*)$/[NC,L,QSA,F] 

Speriamo che questo aiuterà gli altri che hanno sperimentato difficoltà con lo stesso problema; sembra che ci sia stato poco successo con questo altrove sul web.

Il mio caso specifico riguarda la prevenzione dell'accesso diretto a html e altri file senza modificarli direttamente o utilizzando uno script di download. Il codice PHP viene utilizzato per generare una pagina con collegamenti a questi file, da cui Javascript esegue una chiamata ajax per recuperare il timestamp del server e imposta un cookie. Il timestamp nel cookie viene confrontato con il tempo in Apache al caricamento della pagina, se è all'interno di un determinato intervallo è concesso l'accesso.

+1

Non credo che questo è fuori tema, è chiaramente correlato LAMP. – puk

risposta

0

Ecco come faccio (si potrebbe pensare che sia un sacco di istruzioni, ma è talmente rapido rispetto alla movimentazione PHP che non si deve preoccupare di 5 (o qualcosa) cond invece di 2 (o qualcosa)):

RewriteEngine On 
RewriteCond %{HTTP_COOKIE} my_cookie=([^;]+) [NC] 
# Don't touch anything but create MYCOOKIE environment 
# and set it to empty if not found: 
RewriteRule . - [E=MYCOOKIE:${my_rewrite_map_func:%{TIME}%1|}] 
# If the environment was found = not empty: 
RewriteCond %{E:MYCOOKIE} !^$ [NC] 
# ... then process a rewrite rule: 
RewriteRule [blabla...blabla] 

Faccio alcune cose del genere 50 volte e il mio server web è ancora incredibilmente veloce. (Il collo di bottiglia è il database)

Spero che questo aiuti

Problemi correlati