2015-01-02 15 views
5

próbuję przepisać URL za pomocą pliku .htaccess tak, że następujący adres URLCSS, JS oraz obrazy nie są wyświetlane z pretty url

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

można uzyskać przez:

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

na określony "klucz" określi, która strona ma zawierać kod PHP. Mam już następujący kod htaccess, jednak CSS, JS, obrazy i takie nie są wyświetlane przy użyciu drugiego (czysty) URL. Jakieś pomysły dotyczące tego, co może być problemem?

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

Musisz użyć * bezwzględnych * ścieżek zamiast * względnych * ścieżek dla wszystkich zasobów html (css, js, obrazów, linków href, itp) –

+0

Dzięki za odpowiedź! Lokalizacja webappa może się jednak zmienić, to byłby ból, aby zmienić wszystkie ścieżki, szukam rozwiązania htaccess. – PHPNorton

+1

Nie można sobie z tym poradzić z htaccess. Wszystko, co możesz zrobić, to używać ** bezwzględnych ** ścieżek. Możesz to zrobić dodając tag tuż po każdym '' na twoich stronach: ''. Zobacz moją odpowiedź na podobne pytanie tutaj: http: // stackoverflow.com/questions/25630373/a-way-to-avoid-alias-path-to-include-html-resources-like-css/25632455 # 25632455 –

Odpowiedz

5

Kiedy używać względnych adresów URL, przeglądarka będzie dynamicznie stworzyć kompletny adres URL za pomocą adresu URL zasobu ładowany. Innymi słowy: używa adresu URL, ponieważ jest wyświetlany na pasku adresu. W twoim przypadku (www.domain.com/subfolder/index.php/key) próbuje załadować dowolny względny adres URL względem www.domain.com/subfolder/index.php/. Twoje zasoby nie są jednak tam zlokalizowane.

Masz dwie możliwości rozwiązania tego problemu:

  • konwertować względne URL język absolutny URL, przynajmniej bezwzględna do katalogu głównego domeny. Coś takiego jak <img src="img/unicorn.png"> powinno zostać przekształcone w <img src="/path/to/img/unicorn.png">.

  • Dodaj podstawę do elementu głowy. Ta baza będzie używana zamiast adresu URL zasobu do obliczenia pełnego adresu URL. Powinieneś dodać <base href="/"> do swojego elementu <head>. / zostanie użyty jako podstawa dowolnego adresu URL.

1

Czy próbowałeś podstawowego adresu URL? To najlepsze rozwiązanie, z którym się zetknąłem. Wystarczy umieścić jedną w głowie, a następnie można nawet podać identyfikator i uzyskać dostęp do adresu URL za pomocą javascript.

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

dostęp z jQuery

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

Wszelkie dodatkowe informacje (przykłady kodu, dokumentacja) dotyczące wdrażania tego pomysłu poprawiłyby tę odpowiedź. – ryanyuyu

0

Ponadto, można spróbować dodać to do .htaccess:

RewriteBase/
+0

Dlaczego miałoby to cokolwiek zrobić? RewriteBase jest podstawą, która jest używana do przepisywania, ale ponieważ ten problem nie jest związany z rzeczywistymi zmianami, nie ma to żadnego skutku. – Sumurai8

1

Właściwie istnieje rozwiązanie z .htaccess!

Zakładając, że index.php znajduje się w /mysite/ i pliki Ressources są w /mysite/scripts/, /mysite/images/ i /mysite/style/ jak kopalnie, można iść tak:

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 

Widać .htaccess mod_rewrite - how to exclude directory from rewrite rule na kilka innych sposobów

Powiązane problemy