quy tắc mod_rewrite để chuyển hướng tất cả các yêu cầu ngoại trừ một đường dẫn cụ thể


39

Tôi đang cố chuyển hướng tất cả các yêu cầu đến miền của mình tới một miền khác bằng cách sử dụng mod_rewrite trong khai báo VirtualHost Apache 2.2. Có một ngoại lệ cho điều này - tôi muốn tất cả các yêu cầu đến đường dẫn /audiokhông phải là để được chuyển hướng.

Tôi đã viết một RewriteCond và RewriteRule để làm điều này nhưng nó không hoàn toàn đúng và tôi không thể hiểu tại sao. Cụm từ thông dụng có chứa dấu cộng âm cho chuỗi "/ âm thanh", nhưng vì một số lý do không phù hợp. Đây là định nghĩa:

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net(?!/audio) [NC] 
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301] 

Nếu tôi thay đổi RewriteCond để:

RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net/(?!audio) [NC] 

(tức là đặt dấu gạch chéo bên ngoài của phần lookahead âm) sau đó nó hoạt động, nhưng nhược điểm của việc này là yêu cầu mydomain.net không có dấu gạch chéo sẽ không được chuyển hướng.

Có ai có thể chỉ ra những gì tôi đang làm sai?

(Lưu ý: các dấu ngoặc nhọn xung quanh lĩnh vực trong các bit RewriteRule trên đang được thêm vào bởi StackOverflow.com - họ không có trong mã thực tế)


Dưới đây là các quy tắc:

<VirtualHost *:80> 
ServerAdmin [email protected] 
DocumentRoot "/var/www/mydomain.net/htdocs" 
ServerName www.mydomain.net 
ServerAlias mydomain.net 

RewriteEngine on 
RewriteCond {REQUEST_URI} !^/audio 
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301] 
RewriteLog logs/mod_rewrite_log 
RewriteLogLevel 3 

ErrorLog logs/error_log 
CustomLog logs/access_log common 
</VirtualHost> 

cảm ơn @mercutio - mà làm cho cảm giác hoàn hảo nhưng nó vẫn dường như không làm việc.

Đây là những gì các bản ghi mod_rewrite nói khi tôi thực hiện một yêu cầu đến http://mydomain.net/audio/something.mp3:

(2) init rewrite engine with requested uri /audio/something.mp3 
(3) applying pattern '^(.*)$' to uri '/audio' 
(2) rewrite '/audio' -> 'http://www.newdomain.net/' 
(2) explicitly forcing redirect with http://www.newdomain.net 
(1) escaping http://www.newdomain.net for redirect 
(1) redirect to http://www.newdomain.net [REDIRECT/301] 

Kể từ khi REQUEST_URI không bắt đầu với /audio tôi mong chờ các RewriteRule để được bỏ qua.

  0

áp dụng mô hình để uri '/ âm thanh' Âm thanh như nó xử lý một mô hình khác nhau. Hoặc có lẽ logic chỉ là ngược lại bây giờ. Bạn có thể đăng toàn bộ quy tắc của mình không? 21 aug. 082008-08-21 09:33:59

47

HTTP_HOST chỉ chứa tên máy chủ, không chứa đường dẫn của URL được yêu cầu.

RewriteCond %{REQUEST_URI} !^/audio 

Nên là tất cả những gì bạn cần.

Hơn nữa, bạn có thể nhận được thông tin gỡ lỗi từ động cơ viết lại với những điều sau đây, mà là thực sự hữu ích để xem làm thế nào điều kiện và quy tắc của bạn đang được xuất hiện: '(. *)^$'

RewriteLog /path/to/log/file 
RewriteLogLevel 3 
  0

Bạn nên chỉnh sửa câu trả lời của mình, thay vì thêm câu trả lời khác. 05 jun. 122012-06-05 00:46:00

  0

Cập nhật: RewriteCond vẫn chính xác, nhưng trong các phiên bản của apache> = 2,4, RewriteLog không còn hoạt động nữa. Bạn có thể đặt Loglevel cụ thể thành mod_rewrite bằng 'LogLevel rewrite: trace3' nhưng sau đó cần xem ErrorLog cho đầu ra. 07 dec. 172017-12-07 13:28:38