CSS, JS и изображения не отображаются с красивым URL

Я пытаюсь переписать URL через файл htaccess, чтобы следующий URL

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

могут быть доступны по:

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

указанный "ключ" будет определять, какую страницу включать в код PHP. У меня уже есть следующий код htaccess, однако CSS, JS, изображения и тому подобное не отображаются при использовании второго (чистого) URL. Любые идеи относительно того, что может быть проблемой?

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

4 ответа

Когда вы используете относительные URL-адреса, браузер динамически создает полный URL-адрес, используя URL-адрес загруженного ресурса. Другими словами: он использует URL-адрес, отображаемый в адресной строке. В твоем случае (www.domain.com/subfolder/index.php/key) он пытается загрузить любой относительный URL относительно www.domain.com/subfolder/index.php/, Ваши ресурсы, однако, не находятся там.

У вас есть два варианта решения этой проблемы:

  • Преобразуйте ваши относительные URL-адреса в абсолютные, по крайней мере, в абсолютный корень домена. Что-то вроде <img src="img/unicorn.png"> должен быть превращен в <img src="/path/to/img/unicorn.png">,

  • Добавьте базу к вашей голове элемента. Эта база будет использоваться вместо URL ресурса для расчета полного URL. Вы должны добавить <base href="/"> на ваш <head> элемент. / будет использоваться в качестве основы для любого относительного URL.

На самом деле есть решение с.htaccess!

Предполагая, что ваш index.php находится в /mysite/ и ваши файлы ресурсов находятся в /mysite/scripts/, /mysite/images/ а также/mysite/style/ как мины, вы можете пойти так:

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

Вы можете увидеть .htaccess mod_rewrite - как исключить каталог из правила перезаписи для нескольких других способов

Вы пробовали базовый URL? Это лучшее решение, с которым я столкнулся. Просто вставьте один в голову, и тогда вы даже можете дать ему идентификатор и получить доступ к URL с помощью JavaScript.

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

Доступ с помощью jquery

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

Кроме того, вы можете попробовать добавить это в ваш HTaccess:

RewriteBase /
Другие вопросы по тегам