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 /