2010-10-10 19 views
11

Mam plik .htaccess, który mapuje .htaccess przepisać łamie ścieżek względnych

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

Ta część działa prawidłowo. Problem jestem stoi teraz to, że wszystkie moje obrazy i css rezydować w podkatalogu o nazwie aktywów, tj

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

Po przekierowaniu przeglądarka będzie szukać plików pod

http://www.myserver.com/home/assets/images/
co powoduje rzeczy do złamania, jak nie jest to poprawna ścieżka.

I udało się dodać kolejną przeróbkę, która mapuje powyższe do właściwego podkatalogu jednak Firebug pokazuje, że obrazy są zamieszkały w:

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

wiem, że to naprawdę nie jest problem, mimo wszystko, moje obrazy i css ładują się dobrze z tą regułą. Jestem po prostu ciekawa, w jaki sposób mogę uczynić ścieżkę pokazaną jako rzeczywistą ścieżkę, która jest:

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

Wklejanie mojego pliku htaccess poniżej. Bardzo dziękuję z góry.

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

Odpowiedz

15

Problemem jest to, że nie uważają, że względne adresy URL są rozstrzygane na podstawie identyfikatora URI, który jest URI dokumentu HTML odniesienia jest używany. Więc ścieżką względną URI jak assets/images/ w dokumencie HTML ze ścieżką URI /home/ została rozstrzygnięta na /home/assets/images/ zamiast na /assets/images/.

Nie można tego zmienić za pomocą mod_rewrite, ponieważ rozdzielczość URI jest wykonywana przez klienta, a nie przez serwer. Jedyne rozwiązania są:

  • zmiana baza URI pomocą BASE element (zauważ, że to wpływa wszystkie względną URI);
  • używanie bezwzględnych ścieżek URI, np. /assets/images/ zamiast względnego assets/images/;
  • dostosowanie względnej ścieżki URI, więc odniesienia w /home/ są dostosowane do ../assets/images/, aby odzwierciedlić głębokość ścieżki.
+0

starałem, aby nie trzeba iść ścieżką konwersji wszystkich moich ścieżek względnych na bezwzględne, ale niestety, ja może teraz trzeba. Z drugiej strony zupełnie zapomniałem o tagu

BASE
! To działało jak urok. Dzięki Gumbo, doceń to. – irot

+0

@irot: Ponownie, zauważ, że zmiana podstawowego URI przy użyciu 'BASE' wpływa na * wszystkie * względne URI, a nie tylko te ze względnymi ścieżkami. – Gumbo

+0

Wpływa również na znaczniki zakotwiczenia z skrótami. Każdy znacznik zakotwiczenia z atrybutem href, takim jak "#content", rozwiąże podstawowy adres URL, a nie bieżącą stronę. – VirtuosiMedia

9

Dodaj tę linię <BASE href="http://www.yoursitename.com/"> na swojej stronie wewnątrz znacznika <head> jak:

<head> 
     <title>Your site title</title> 
     <BASE href="http://www.yoursitename.com/"> 
.... 
</head> 
Powiązane problemy