2011-12-10 38 views
5

Tôi đang cố gắng sử dụng kết quả của hàm RewriteMap để có điều kiện cho phép truy cập vào một thư mục.
Mục đích là đọc một dấu thời gian từ một cookie (my_cookie) và chuyển nó vào trong RewriteMap (my_rewrite_map_func) mà tôi đã định nghĩa trong httpd.conf (Đó là một tập tin thực thi lặp lại chuỗi "TRUE" hoặc "FALSE" để stdout nếu dấu thời gian trong cookie nằm trong phạm vi nhất định của thời gian hiện tại trong Apache).Apache RewriteMap được sử dụng để ngăn truy cập trực tiếp vào các tệp

RewriteMap my_rewrite_map_func prg:/var/www/program 

Nội dung của tập tin .htaccess của tôi là:

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

Tôi có thể khẳng định rằng chương trình riêng của mình đang làm việc, cookie đang được đọc, và timestamp Apache và timestamp cookie nhất trong phạm vi cho phép.

Regex trên RewriteCond thứ hai kiểm tra xem giá trị trả về của $ {my_rewrite_map_func:% {TIME}% 1 | FALSE} là FALSE, tuy nhiên, bất kể những gì tôi đặt thành, RewriteRule không bao giờ xảy ra.

Về cơ bản, tôi không thể xác định cách đánh giá giá trị của $ {my_rewrite_map_func:% {TIME}% 1 | FALSE}. Có cách nào tôi có thể trích xuất tốt hơn hoặc lưu trữ giá trị này?

Mọi trợ giúp sẽ được đánh giá cao nhất.

CẬP NHẬT - GIẢI PHÁP: Tôi không chắc chắn lý do tại sao câu hỏi này đã được gắn cờ là tắt chủ đề, nó liên quan đến việc bảo vệ các file html từ một kịch bản php bằng phương tiện của tập tin một Apache .htaccess sử dụng mod_rewrite để gọi một chương trình C++ .

Bất kể, các mã trên hoạt động hoàn hảo khi sử dụng kết hợp với hai dòng bổ sung để xử lý các trường hợp cookie không tồn tại:

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

Hy vọng rằng điều này sẽ giúp những người khác đã gặp khó khăn với vấn đề tương tự; có vẻ như đã có rất ít thành công với điều này ở nơi khác trên web.

Trường hợp cụ thể của tôi đề cập đến việc ngăn truy cập trực tiếp vào html và các tệp khác mà không cần sửa đổi chúng trực tiếp hoặc sử dụng tập lệnh tải xuống. Mã PHP được sử dụng để tạo ra một trang có liên kết đến các tệp này, từ đó Javascript thực hiện một cuộc gọi ajax để lấy dấu thời gian của máy chủ và đặt một cookie. Dấu thời gian trong cookie được so sánh với thời gian trong Apache khi tải trang, nếu nó nằm trong một phạm vi truy cập nhất định được cấp.

+1

Tôi không tin rằng đây là chủ đề, rõ ràng là LAMP có liên quan. – puk

Trả lời

0

Đây là cách tôi làm (bạn có thể nghĩ rằng đó là một rất nhiều hướng dẫn, nhưng nó sooo nhanh chóng so với xử lý PHP mà bạn không nên lo lắng về 5 (hoặc một cái gì đó) cond thay vì 2 (hoặc một cái gì đó)):

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] 

Tôi thực hiện một số nội dung như vậy 50 lần và máy chủ web của tôi vẫn cực kỳ nhanh. (nút cổ chai là cơ sở dữ liệu)

Hy vọng điều này sẽ giúp

Các vấn đề liên quan