2010-10-10 32 views
11

Tôi có một file .htaccess mà bản đồ htaccess viết lại phá vỡ đường dẫn tương đối

http://www.myserver.com/home/
để
http://www.myserver.com/index.php?section=home

phần này hoạt động tốt. Vấn đề tôi đang phải đối mặt hiện nay là, tất cả hình ảnh và css của tôi nằm trong một tài sản tiểu thư mục có tên, tức là

http://www.myserver.com/assets/images/
http://www.myserver.com/assets/css/
, vv

Sau khi chuyển hướng trình duyệt sẽ tìm kiếm các tập tin dưới

http://www.myserver.com/home/assets/images/
gây thứ để phá vỡ, như đây không phải là đường dẫn hợp lệ.

tôi đã có thể để thêm một viết lại rằng bản đồ ở trên để đúng thư mục con, tuy nhiên, Firebug cho thấy những hình ảnh được cư trú tại:

http://www.myserver.com/home/assets/images/

Tôi biết nó không phải là thực sự là một vấn đề, sau khi tất cả, hình ảnh và css của tôi đang tải tốt với quy tắc này. Tôi chỉ tò mò về cách tôi có thể làm cho con đường được hiển thị là đường dẫn thực tế, đó là:

http://www.myserver.com/assets/images/

Dán tệp htaccess của tôi bên dưới. Cảm ơn bạn rất nhiều trước.

Options +FollowSymlinks 
RewriteEngine on 
RewriteRule ^([^/]+)/assets/(css|images|js)/(.*)$ /assets/$2/$3 [NC,L] 
RewriteRule ^([^/]+)/$ /index.php?section=$1 [NC,L]

Trả lời

15

Vấn đề là bạn không cân nhắc rằng URL tương đối được giải quyết trên cơ sở URI đó là URI của tài liệu HTML tài liệu tham khảo được sử dụng trong. Vì vậy, một con đường URI tương đối như assets/images/ trong một tài liệu HTML với đường dẫn URI /home/ được giải quyết thành /home/assets/images/ thay vì /assets/images/.

Bạn không thể thay đổi điều này với mod_rewrite là độ phân giải URI được thực hiện bởi máy khách và không phải bởi máy chủ. Các giải pháp duy nhất là:

  • thay đổi cơ sở URI sử dụng BASE element (lưu ý rằng điều này ảnh hưởng tất cả tương đối URI);
  • sử dụng đường dẫn URI tuyệt đối, ví dụ: /assets/images/ thay vì họ hàng assets/images/;
  • điều chỉnh đường dẫn URI tương đối, do đó, các tham chiếu trong /home/ được điều chỉnh thành ../assets/images/ để phản ánh độ sâu đường dẫn.
+0

Tôi đã cố gắng không để phải đi con đường chuyển đổi tất cả đường dẫn tương đối của tôi để tuyệt đối, nhưng than ôi, tôi có thể chỉ cần có ngay bây giờ. Sau đó, một lần nữa, tôi hoàn toàn quên mất thẻ

BASE
! Tiếng Anh> Tiếng Việt. Cảm ơn Gumbo, đánh giá cao nó. – irot

+0

@irot: Một lần nữa, lưu ý rằng việc thay đổi URI cơ sở bằng cách sử dụng 'BASE' sẽ ảnh hưởng * tất cả * các URI tương đối và không chỉ các URI có đường dẫn tương đối. – Gumbo

+0

Nó cũng ảnh hưởng đến các thẻ neo bằng băm. Bất kỳ thẻ neo nào có thuộc tính href như "#content" sẽ giải quyết thành URL cơ sở chứ không phải trang hiện tại. – VirtuosiMedia

9

Thêm dòng này <BASE href="http://www.yoursitename.com/"> vào trang của bạn bên trong thẻ <head> như sau:

<head> 
     <title>Your site title</title> 
     <BASE href="http://www.yoursitename.com/"> 
.... 
</head> 
Các vấn đề liên quan