2012-06-30 27 views
6

Sau đây là cấu trúc thư mục của tôi:Redirect từ một thư mục khác với mod_rewrite

admin\ 
controls\ 
images\ 
media\ 
lib\ 
models\ 
views\ 
index.php 
.htaccess 

Sau đây là .htaccess tôi

RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php 

Tôi muốn tất cả mọi thứ trong/admin/hình ảnh bằng/hình ảnh trong thư mục gốc. Ví dụ: http://www.example.com/admin/images/example.png sẽ được giống như http://www.example.com/images/example.png

Vấn đề với .htaccess của tôi là: Nó đi vào index.php thay vì phản ánh admin/hình ảnh để images/


Giải pháp

RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php 
+0

Nhưng vấn đề là gì? – brezanac

+0

Nó đi đến index.php thay vì sao chép admin/hình ảnh vào hình ảnh/ – invisal

Trả lời

10

Bạn cần xác định rằng quy tắc ghi đè hình ảnh của bạn là quy tắc cuối cùng trong hàng để tránh viết lại thêm. Đối với điều đó, bạn chỉ cần chỉ định [L] ở cuối quy tắc ghi đè hình ảnh của mình.

RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php 

EDIT: Dưới đây là một lời giải thích lý do tại sao vấn đề xảy ra (lấy từ phần ý kiến ​​để làm rõ).

Bạn thấy bản gốc %{REQUEST_FILENAME} sẽ không bao giờ thay đổi cho dù có bao nhiêu giai đoạn viết lại được thực hiện. Điều đó có nghĩa là khi quy tắc thứ hai đạt tới biến đó sẽ thực sự vẫn trỏ đến hình ảnh hiện có (có nghĩa là trong /admin/images/) thay vì quy tắc thứ hai được ghi đè và không tồn tại (/images/). Đó là lý do tại sao quy tắc thứ hai sẽ luôn luôn được áp dụng và tại sao hai dòng có điều kiện từ ví dụ này hầu như luôn là những quy tắc đầu tiên được sử dụng trong quá trình viết lại.

+1

Tôi đã ngu ngốc. Tôi đã thử [L] một lần (có lẽ tôi đã quên tiết kiệm thời gian đó và nó không hoạt động). Cảm ơn bạn rất nhiều. Nó hiện đang hoạt động. – invisal

+0

Xin lỗi, tôi cũng muốn hiểu. RewriteCond nói rằng quy tắc cuối cùng phải được áp dụng chỉ khi tệp được yêu cầu không phải là tệp hoặc thư mục ... không phải là tệp hình ảnh (giả sử rằng hình ảnh đó tồn tại)? – Zagorax

+0

Bạn đúng nhưng có một mẹo nhỏ ẩn trong các quy tắc này có trách nhiệm gây nhầm lẫn :) Bạn thấy bản gốc '% {REQUEST_FILENAME}' sẽ ** không bao giờ ** thay đổi bất kể có bao nhiêu giai đoạn viết lại được thực hiện. Điều đó có nghĩa là khi quy tắc thứ hai đạt tới biến đó sẽ thực sự vẫn trỏ đến hình ảnh hiện có (có trong '/ admin/images /') chứ không phải là một cái được viết lại và không tồn tại ('/ images /'). Đó là lý do tại sao quy tắc thứ hai sẽ luôn luôn được áp dụng và tại sao hai dòng có điều kiện từ ví dụ này hầu như luôn là những quy tắc đầu tiên được sử dụng trong quá trình viết lại. – brezanac

4

Thay đổi quy tắc như sau:

RewriteEngine On 
RewriteRule ^admin/images/(.*) images/$1 

Và đặt .htaccess vào thư mục gốc tài liệu của bạn hoặc trong thư mục mẹ '/ quản trị'.

+0

Tôi đã thử và nó không hoạt động. Tôi cũng đặt trong thư mục tài liệu và thư mục quản trị. Dù sao, cảm ơn bạn đã trả lời câu hỏi của tôi. +1 – invisal

+0

Khá lạ. Hãy xem http://www.francescoruvolo.it/test/admin/images/. Nó hoạt động hoàn hảo trên máy chủ của tôi. Tôi không có bất kỳ index.html trong/test/admin/images nào trong khi tôi có một thử nghiệm/hình ảnh. Httpd.conf của bạn có cho phép sử dụng .htaccess không? – Zagorax

+0

Vấn đề là RewriteRule khác của tôi ghi đè RewriteRule này. Việc thêm [L] chỉ đơn giản là giải quyết vấn đề. – invisal

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