2011-09-13 27 views
7

Tôi đang tìm một bộ quy tắc mod_rewrite chung (không phụ thuộc vào máy chủ) để thực hiện kiểm tra HTTP_REFERER trên tài nguyên. Tôi đã đưa ra những điều sau đây có vẻ trực quan, nhưng đáng tiếc là không hoạt động:Generic mod_rewrite referrer check

RewriteCond %{HTTP_REFERER} !^https?://%{HTTP_HOST}/.* 
# RewriteRule .* - [F] # <- or whatever 

Dường như bạn không thể có một biến trên cả hai mặt của so sánh. Vì vậy, một hack:

RewriteCond %{HTTP_HOST}##%{HTTP_REFERER} !^([^#]*)##https?://\1/.* 

Nhưng wow, đó là xấu xí - và nếu bạn không biết chính xác những gì đang xảy ra, nó gây nhầm lẫn khủng khiếp.

Có cách nào tốt hơn (sạch) hơn để viết các quy tắc này không?

+0

có vẻ khá phức tạp để làm điều đó với rewriteCond. Có lẽ mod_macro sẽ là một cách khác để suy nghĩ vấn đề của các quy tắc độc lập với máy chủ. – regilero

Trả lời

6

"nếu bạn không biết chính xác những gì đang xảy ra, đó là khủng khiếp khó hiểu"

congrats lần thứ nhất về thực hiện giải pháp. Kiểm tra nguồn, mod_rewrite.c dường như không làm bất kỳ dạng nội suy biến nào, vì vậy tôi không thể nghĩ ra một giải pháp thay thế. Đối với điểm "khó hiểu" của bạn, đó không phải là lý do tại sao chúng tôi có nhận xét? Tôi cũng đã dọn dẹp regexp của bạn (ví dụ: dấu gạch chéo. * Là dự phòng) và được sử dụng = như một delim để nhấn mạnh rằng bạn đang so sánh.

Nó có thể trông có vẻ phức tạp, nhưng ý tưởng của bạn gần như tối ưu về thời gian chạy.

# 
# Is **HTTP_REFERER** of the form http(s)://HTTP_HOST/.... 
# Note that mod_rewrite only does interpolation in the teststring so this is 
# set up in the format AAAA=BBBB and the pattern uses a backreference (\1) to 
# match the corresponding elements of AAAA and BBBB 
# 
RewriteCond %{HTTP_HOST}==%{HTTP_REFERER} !^(.*?)==https?://\1/ 
+1

Bạn là cả hai thiên tài. Cảm ơn bạn! –