2011-12-10 11 views
5

Próbuję użyć wyniku funkcji RewriteMap, aby warunkowo umożliwić dostęp do katalogu.
Intencją jest odczyt znacznika czasu z pliku cookie (my_cookie) i przesłanie go do pliku RewriteMap (my_rewrite_map_func), który zdefiniowałem w httpd.conf (jest to plik wykonywalny, który zawiera ciągi znaków "TRUE" lub "FALSE" na standardowe wyjście, jeśli znacznik czasu w ciasteczku mieści się w określonym przedziale czasowym w Apache).Aplikacja Apache RewriteMap używana do zapobiegania bezpośredniemu dostępowi do plików

RewriteMap my_rewrite_map_func prg:/var/www/program 

Zawartość moim pliku .htaccess są:

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

Mogę potwierdzić, że sam program działa, plik cookie jest odczytywany, a timestamp Apache i datownik cookies znajdują się w dozwolony zakres.

Wyrażenie regularne w drugim cyklu RewriteCond sprawdza, czy zwracana wartość $ {my_rewrite_map_func:% {TIME}% 1 | FALSE} jest równa FAŁSZ, jednak niezależnie od tego, do czego to ustawiam, RewriteRule nigdy nie występuje.

Zasadniczo nie mogę określić, jak oszacować wartość $ {my_rewrite_map_func:% {TIME}% 1 | FALSE}. Czy istnieje sposób, w jaki mogę lepiej wyodrębnić lub przechować wartość tego?

Każda pomoc będzie najbardziej ceniona.

AKTUALIZACJA - ROZWIĄZANIE: Nie jestem pewien, dlaczego to pytanie zostało oznaczone jako off topic, to odnosi się do ochrony plików html ze skryptu php za pomocą pliku .htaccess Apache wykorzystaniem mod_rewrite wezwać C++ Program .

Niezależnie od tego, powyższy kod działa idealnie, gdy używany w połączeniu z dwoma dodatkowymi liniami obsłużyć przypadek cookie nie istniejącego:

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

Mam nadzieję, że to pomoże innym, którzy doświadczyli trudności z tej samej kwestii; wygląda na to, że odniosło to niewielki sukces w Internecie.

Mój konkretny przypadek dotyczy zapobiegania bezpośredniemu dostępowi do html i innych plików bez modyfikowania ich bezpośrednio lub za pomocą skryptu pobierania. Kod PHP służy do generowania strony z linkami do tych plików, z której Javascript wykonuje wywołanie ajax, aby pobrać znacznik czasu serwera i ustawia plik cookie. Znacznik czasu w pliku cookie jest porównywany z czasem w Apache przy ładowaniu strony, jeśli jest on w określonym zakresie dostępu.

+1

Nie wierzę, że to nie jest temat, jest to wyraźnie związane z LAMPĄ. – puk

Odpowiedz

0

Oto jak ja (może uważasz, że jest wiele wskazówek, ale to sooo szybkie w porównaniu z obsługą PHP, że nie należy martwić się około 5 (lub coś) przewod zamiast 2 (lub coś)):

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] 

Robię coś takiego 50 razy, a mój serwer WWW jest niesamowicie szybki. (wąskie gardło jest bazą danych)

Mam nadzieję, że to pomoże

Powiązane problemy