2014-09-25 16 views
6

Tôi đang thiết lập một cookie sẽ sử dụng quy tắc viết lại, và điều đó đang làm việc (giản thể vì lợi ích của ngắn gọn):Quy tắc ghi đè Apache: Cách kiểm tra tên máy chủ trong cookie?

RewriteCond %{QUERY_STRING} set_cookie=1 [NC] 
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI}?skip=1 [QSA,NE,NC,L,CO=test_%{HTTP_HOST}:tmp:%{HTTP_HOST}:5:/] 

một này thiết lập một cookie với tên test_ {host_name}. Bây giờ tôi muốn đọc giá trị cookie đó yêu cầu tiếp theo. Tôi đã thử điều này (và một số biến thể), nhưng điều đó dường như không hoạt động.

RewriteCond %{QUERY_STRING} skip [NC] 
RewriteCond %{HTTP_COOKIE} ^.*test_%{HTTP_HOST}=tmp.*$ [NC] 
RewriteRule ^(.*)$ - [L] 

Khi tôi được googling, tôi found an article rằng tuyên bố như sau:

Nếu bạn đang tự hỏi, "Tại sao không sử dụng% {HTTP_HOST} thay vì corz.org, tạo mã phổ biến?" , theo như tôi biết, không thể kiểm tra một biến máy chủ so với biến số khác bằng RewriteCond mà không sử dụng Tham khảo về nguyên tử và một số POSIX 1003.2+ Jiggery-Pokery nghiêm trọng.

Tôi đoán đó là vấn đề của tôi, nhưng tôi không biết cách giải quyết nó. Bất kỳ trợ giúp nào cũng được đánh giá rất cao.

Trân trọng, Joost.

Trả lời

1

Tôi đã tìm thấy giải pháp. một phần trong câu hỏi ban đầu của tôi

RewriteCond %{QUERY_STRING} skip [NC] 
RewriteCond %{HTTP_COOKIE} ^.*test_%{HTTP_HOST}=tmp.*$ [NC] 
RewriteRule ^(.*)$ - [L] 

này nên được thay thế bởi những điều sau

RewriteCond %{QUERY_STRING} skip [NC] 
RewriteCond %{HTTP_HOST}@@%{HTTP_COOKIE} ^([^@]*)@@.*test_\1=tmp.* [NC] 
RewriteRule ^(.*)$ - [L] 

Chỉ RewriteCond thứ hai đã thay đổi. Phía bên trái của nó (%{HTTP_HOST}@@%{HTTP_COOKIE}) nối các giá trị máy chủ và cookie http, sử dụng @@ như keo (@@ không thực sự có nghĩa là gì đó, nó chỉ không được sử dụng trong một máy chủ hoặc chuỗi cookie bình thường).

Mặt bên phải (^([^@]*)@@.*test_\1=tmp.*) khớp với mọi thứ "@" đầu tiên, là tên máy chủ và sau đó kiểm tra xem có thể tìm thấy ở đâu đó trong giá trị cookie không, trước "test_" và tiếp theo "= tmp ".

1

Có một mẹo hữu ích trong lĩnh vực này. Nó là regex đơn giản, nhưng một kiểu mod_rewrite độc ​​đáo.

Lưu ý tôi không phải quá cẩn thận về khớp ở đây đặc biệt là trong điều kiện đầu tiên - đây là để minh hoạ trong điều kiện 2:

RewriteEngine ON 
RewriteCond %{HTTP_COOKIE} test_([^;]*)=tmp.*$ 
RewriteCond %1<>%{HTTP_HOST} ^(.+)<>\1 
RewriteRule .* - [F] 

Phần tiểu thuyết (đối với mod_rewrite) là bạn chỉ có thể sử dụng biến/backrefs trong đối số đầu tiên, nhưng bạn có thể sử dụng backrefs (cho biểu thức hiện tại, không phải là từ trước) trong tham số thứ 2.

Nhỏ <> chỉ là thứ không thể xuất hiện dưới dạng dấu tách.

+0

Tại sao [F] thay vì [L]? – jberculo

+0

Và điều này sẽ không phá vỡ nhiều cookie cùng một phần không? ví dụ. cookie subdomain.domain.com và domain.com đều khả dụng trên subdomain.com? để cookie có tên là test_subdomain.domain.com và test_domain.com với các giá trị khác nhau? – jberculo

+0

Tôi không làm cho nó hoạt động. Tôi thực sự cần để có thể kiểm tra một cookiename chính xác, như nhiều có thể có mặt. Ngoài ra tôi cần phải có thể kiểm tra sự vắng mặt của cookie ... – jberculo

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