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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Предполагая, что ваш index.php находится в /mysite/, а ваши файлы ressources находятся в /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 - как исключить каталог из правила перезаписи для нескольких других способов.

Ответ 4

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

RewriteBase /