2011-08-28 21 views
34

Tôi đã lệnh sau trong .htaccess tôiNhiều RewriteRules cho RewriteCond duy nhất trong .htaccess

RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC] 
    RewriteRule ^(.*?)-([a-z]+) %2/$1.$2 [L] 
    RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/$1$3.$2 [L] 

% 2 không hoạt động trong dòng thứ hai và sau đó. Tôi có thể định nghĩa bất kỳ biến nào cho% 2 và sử dụng nó trong tất cả các lệnh RewriteRule không? Lệnh sau hoạt động

 RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC] 
    RewriteRule ^(.*?)-([a-z]+) %2/$1.$2 [L] 
    RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC] 
    RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/$1$3.$2 [L] 

Nhưng tôi muốn sử dụng% 2 cho nhiều dòng quy tắc không có điều kiện trùng lặp.

+0

bạn có thể xem 4 thủ thuật được liệt kê ở đây, http://stackoverflow.com/a/24276207/5064633 – super1ha1

Trả lời

27

Biến phải được lưu lại dưới dạng một var Apache, sau đó có thể được sử dụng mà không lặp lại điều kiện.

Lưu trong biến Apache được hiển thị ở dòng thứ hai. Sử dụng các vars đã lưu trong dòng thứ 3 và thứ 4.

RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC] 
RewriteRule .? - [E=Wa:%1,E=Wb:%2] 
RewriteRule ^(.*?)-([a-z]+) %{ENV:Wb}/$1.%{ENV:Wb} [L] 
RewriteRule ^(.*?)-([0-9]+)([a-z]) %{ENV:Wb}/$1$3.$2 [L] 
+1

chính xác những gì tôi cần Hussain! – Nasaralla

+0

Các biến Apache này có an toàn không? – rustyx

+0

Bạn có thể sử dụng biến Wb Nơi bạn muốn tên miền phụ ảo. – Huseyin

48

Bạn có thể sử dụng RewriteRule cờ S|skip để buộc bội RewriteRules đến một RewriteCond duy nhất (hoặc một tập hợp các RewriteConds). Dưới đây là một ví dụ áp dụng một Cond ba Rules:

RewriteCond %{HTTP_HOST} !^www.mydomain.com$ 
# skip rules if NOT within domain - only way to tie multiple rules to one cond 
RewriteRule .? - [S=3] 
RewriteRule ^path1(/.*)$ /otherpath1$1 
RewriteRule ^path2(/.*)$ /otherpath2$1 
RewriteRule ^path3(/.*)$ /otherpath3$1 

Để thay đổi một Cond hiện làm việc cho nhiều Rules bạn phải: (! Thêm vào trước nó với)

  • phủ nhận điều kiện
  • Nếu bạn có nhiều RewriteConds:
    Thay đổi AND hợp lý trong Conds thành ORs và ngược lại.
  • Thêm quy tắc ghi đè bỏ qua trước tất cả các quy tắc mà bạn muốn liên kết với (các) điều kiện. Đặt tham số S thành số dòng Rule bị bỏ qua.

Xin lưu ý rằng không thể sử dụng bất kỳ backreferences nào trỏ ngược lại RewriteCond (như% 1) trong Quy tắc bị bỏ qua. Đây chỉ có thể truy cập trong RewriteRule bỏ qua.

+0

Điều này chỉ giải quyết phần logic, không phải phần backreferences, vì 'RewriteCond' về mặt kỹ thuật vẫn chỉ áp dụng cho' RewriteRule' đầu tiên. Câu hỏi ban đầu cần backreferences. – rustyx

+1

Tôi đã đề cập đến điều này trong câu cuối cùng của anwser của tôi, @rustyx. Tuy nhiên tôi nghĩ rằng nhiều người dùng không cần tham khảo trở lại sẽ đọc bài đăng này và sẽ tận hưởng giải pháp dựa trên bỏ qua. – Jpsy

+1

Câu trả lời này không trả lời câu hỏi, nhưng thực sự hữu ích nếu không ... – NemoStein

6

Rõ ràng, điều này không vui lắm, đặc biệt khi mọi thứ phát triển và trở nên phức tạp hơn. Tuy nhiên, có một tùy chọn ít được biết đến của câu lệnh RewriteRule, điều đó cho apache bỏ qua số N câu lệnh RewriteRule tiếp theo. [S = N]. Vì vậy, thay vì kiểm tra mỗi lần nếu yêu cầu KHÔNG phải là một tập tin và không phải là một thư mục, chúng ta có thể làm điều này: khối Mã

# 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule .* - [S=3] 
RewriteRule ^([^./]+)/$ http://www.santweb.co.uk/$1 [L] 
RewriteRule ^([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2 [L] 
RewriteRule ^([^./]+)/([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2/$3 [L] 

#

Tôi thấy điều này, từ: http://www.sant-media.co.uk/2010/03/applying-rewritecond-to-multiple-rewriterule-in-htaccess/

Tôi nghĩ rằng nó hữu ích

+1

Không vui. Ai đó nên nói với những người ở Apache về nếu khối khác. Cảm ơn. – Rolf

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