2015-01-02 40 views
5

Tôi cố gắng để viết lại URL thông qua các tập tin htaccess để các URL sauCSS, JS và hình ảnh không hiển thị với khá url

www.domain.com/subfolder/index.php?key 

có thể được truy cập bằng cách:

www.domain.com/subfolder/index.php/key 

sự "khóa" được chỉ định sẽ xác định trang nào cần đưa vào mã PHP. Tôi đã có mã htaccess sau rồi, tuy nhiên CSS, JS, hình ảnh và những thứ như vậy sẽ không được hiển thị khi sử dụng URL thứ hai (sạch). Bất kỳ ý tưởng nào về vấn đề có thể là gì?

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteCond %{DOCUMENT_ROOT}/$1 -f 
RewriteRule ^[^/]+/([^.]+\.(?:js|css|jpe?g|png|gif))$ /$1 [L,R=301,NC] 
RewriteRule ^index.php/([a-zA-Z0-9/_]+)$ index.php?key=$1 
+0

Bạn phải sử dụng đường dẫn * tuyệt đối * thay vì * đường dẫn * tương đối cho tất cả tài nguyên html của bạn (css, js, hình ảnh, liên kết href, v.v.) –

+0

Cảm ơn bạn đã trả lời! Vị trí của webapp có thể thay đổi mặc dù, đó sẽ là một nỗi đau để thay đổi tất cả các đường dẫn, tôi đang tìm kiếm một giải pháp htaccess. – PHPNorton

+1

Bạn không thể xử lý nó bằng htaccess. Tất cả những gì bạn có thể làm là sử dụng ** đường dẫn ** tuyệt đối. Bạn có thể làm điều đó bằng cách thêm một thẻ ngay sau mỗi ' 'trong các trang của bạn:' '. Xem câu trả lời của tôi về một câu hỏi tương tự ở đây: http: // stackoverflow.com/questions/25630373/a-way-to-avoid-apache-alias-đường dẫn-to-include-html-tài nguyên-như-css/25632455 # 25632455 –

Trả lời

5

Khi bạn sử dụng url tương đối, trình duyệt sẽ tự động tạo url hoàn chỉnh bằng cách sử dụng url của tài nguyên được tải. Nói cách khác: Nó sử dụng url như nó được hiển thị trong thanh địa chỉ. Trong trường hợp của bạn (www.domain.com/subfolder/index.php/key), nó sẽ cố gắng tải bất kỳ url tương đối nào liên quan đến www.domain.com/subfolder/index.php/. Tuy nhiên, tài nguyên của bạn không nằm ở đó.

Bạn có hai lựa chọn để giải quyết vấn đề này:

  • Chuyển đổi của bạn tương đối của url vào tuyệt đối url, ít nhất tuyệt đối vào thư mục gốc miền. Một cái gì đó như <img src="img/unicorn.png"> phải được chuyển thành <img src="/path/to/img/unicorn.png">.

  • Thêm cơ sở vào phần tử đầu của bạn. Cơ sở này sẽ được sử dụng thay cho url của tài nguyên để tính url hoàn chỉnh. Bạn nên thêm <base href="/"> vào phần tử <head> của mình. / sau đó sẽ được sử dụng làm cơ sở của bất kỳ url tương đối nào.

1

Bạn đã thử URL cơ sở chưa? Đó là giải pháp tốt nhất mà tôi đã gặp. Chỉ cần đặt một trong đầu và sau đó bạn thậm chí có thể cung cấp cho nó một ID và truy cập URL với javascript.

<base id='baseElement' href="your path goes here"> <!--possibly generated with serverside code--> 

Tiếp cận với jquery

var base = $('#baseElement').attr('href'); 
+0

Bất kỳ thông tin bổ sung nào (ví dụ mã, tài liệu) về cách triển khai ý tưởng này sẽ cải thiện câu trả lời này. – ryanyuyu

0

Ngoài ra, bạn có thể thử để thêm video này htaccess của bạn:

RewriteBase/
+0

Tại sao điều đó lại làm được gì? RewriteBase là cơ sở được sử dụng để viết lại, nhưng vì vấn đề này không liên quan đến việc viết lại thực tế, nó sẽ không có hiệu lực. – Sumurai8

1

Trên thực tế có một giải pháp với .htaccess!

Giả sử rằng index.php của bạn nằm ở /mysite/ và các tập tin ressources bạn đang ở trong /mysite/scripts/, /mysite/images//mysite/style/ như mỏ, bạn có thể đi như thế này:

RewriteEngine on 
#first exclude those folders 
RewriteBase "/mysite/" 
RewriteRule ^(style|scripts|images)($|/) - [L] 
#then go with your rules (the [L] terminates the ruling) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteCond %{DOCUMENT_ROOT}/$1 -f 
RewriteRule ^[^/]+/([^.]+\.(?:js|css|jpe?g|png|gif))$ /$1 [L,R=301,NC] 
RewriteRule ^index.php/([a-zA-Z0-9/_]+)$ index.php?key=$1 

Bạn có thể thấy .htaccess mod_rewrite - how to exclude directory from rewrite rule cho vài cách khác

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